2016-10-31 28 views
5

Java 1.8 güncellemesinden sonra garip bir problemle karşılaşıyorum. Çeşitli yerlerde dosyaları indirmek için bizim yardımcı programlarımızdan birinde jsch-0.1.54.jar kullanıyorum. Bu özel fayda, neredeyse 4-5 yıl boyunca herhangi bir sorun olmadan kullanılıyordu (o zamanlar jsch-0.1.48). O dönemde çevre java 1,6 idi. Son zamanlarda java 1.8'e geçtik ve sonuç olarak bu özel programı geliştirdik. Şimdi garip bir sorunla karşılaşıyoruz ve zaman zaman ortaya çıkıyor ve çoğu zaman dosyaların indirilmesi kayda değer.İmza uzunluğu doğru değil: 127 tane var ama bekliyordum 128

Hata günlüğü

INFO: SSH_MSG_KEXDH_INIT sent 
INFO: expecting SSH_MSG_KEXDH_REPLY 
INFO: Disconnecting from SRV2000 port 22 
2016-10-28 08:42:18:0576 ERROR [main] net.AerisAbstractMethod - Failed to open connection 
com.jcraft.jsch.JSchException: Session.connect: java.security.SignatureException: Signature length not correct: got 127 but was expecting 128 
    at com.jcraft.jsch.Session.connect(Session.java:565) 
    at com.jcraft.jsch.Session.connect(Session.java:183) 
    at com.aeris.net.AerisSFTPMethod.connectToServer(AerisSFTPMethod.java:65) 
    at com.aeris.net.AerisAbstractMethod.getListOfFiles(AerisAbstractMethod.java:143) 
    at com.aeris.worker.AerisUploaderDownloader.performUploadDownloadListing(AerisUploaderDownloader.java:112) 
    at com.aeris.main.AerisCommonSftpUtility.main(AerisCommonSftpUtility.java:102) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.simontuffs.onejar.Boot.run(Boot.java:340) 
    at com.simontuffs.onejar.Boot.main(Boot.java:166) 

Başarı Günlüğü: (vakaların çoğunda öyle başarı)

INFO: SSH_MSG_KEXDH_INIT sent 
INFO: expecting SSH_MSG_KEXDH_REPLY 
INFO: ssh_rsa_verify: signature true 
WARN: Permanently added 'SRV2000' (RSA) to the list of known hosts. 
INFO: SSH_MSG_NEWKEYS sent 
INFO: SSH_MSG_NEWKEYS received 
INFO: SSH_MSG_SERVICE_REQUEST sent 
INFO: SSH_MSG_SERVICE_ACCEPT received 
INFO: Authentications that can continue: publickey,password,keyboard-interactive 
INFO: Next authentication method: publickey 
INFO: Authentication succeeded (publickey). 
2016-10-28 08:36:48:0794 INFO [main] net.AerisAbstractMethod - Session connected to server 
2016-10-28 08:36:48:0794 INFO [main] net.AerisAbstractMethod - Opening SFTP channel.. 
2016-10-28 08:36:48:0810 INFO [main] net.AerisAbstractMethod - Connecting to server through channel. 
2016-10-28 08:36:48:0857 INFO [main] net.AerisAbstractMethod - Connection successful. 
2016-10-28 08:36:48:0857 INFO [main] net.AerisAbstractMethod - Changing to directory:C:/interfaces/ib/wf/work 
2016-10-28 08:36:48:0888 INFO [main] net.AerisAbstractMethod - Start file Listing of the remote directory:C:/interfaces/ib/wf/work 

     0 Oct 28, 2016 04:15 ./ 
     0 Oct 28, 2016 04:15 ../ 

Ben Vandyke (sftp yazılımı sağlayıcısı) ile tam bir analiz yaptım ancak herhangi bulamadık bu hatanın hatası. Ben de farklı araçları kullanarak sftp çalıştım ama hiçbir hata alamıyorum. SFTP sunucusunun bağlanacağı kod snippet'i aşağıdadır. Bu konuda herhangi biri yardımcı olabilir mi?

protected void connectToServer() throws AerisConnectionException { 
     JSch jSch =(JSch)this.client; 
     try { 

      session = jSch.getSession(config.getUsername(), config.getRemoteserver(), config.getPort()); 
      LOGGER.info("Creating SSH Session using Username:"+config.getUsername()+ " Server :" +config.getRemoteserver()+ " at PORT:"+config.getPort()); 
      if(config.getAuth().equalsIgnoreCase("PASSWD")||config.getAuth().equalsIgnoreCase("KEYPASS")){ 
       LOGGER.info("Setting password ..."); 
       session.setPassword(config.getPassword()); 
      } 

      Properties jShconfig = new Properties();    
      jShconfig.put("StrictHostKeyChecking", "no"); 
      jShconfig.put("PreferredAuthentications", 
         "publickey,password,keyboard-interactive"); 
      jShconfig.put("LogLevel", "VERBOSE"); 


      LOGGER.info("Setting timeout to "+config.getTimeOut()); 
      session.setTimeout(config.getTimeOut()*1000); 
      session.setConfig(jShconfig);   

      session.connect(); 
      LOGGER.info("Session connected to server"); 
      this.connected=true; 

     } catch (JSchException e) { 
      LOGGER.error("Failed to open connection ",e); 
      throw new AerisConnectionException("Failed to open connection."); 
     } 

    } 
+0

sunucu bazen, java 8'in artık desteklemediği onaylanmamış şifrelemeyi kullanmayı deniyor – maxpovver

+0

Orijinal istisnasının (Session.java:565'te yakalandığı gibi) bir arama iletisini bulabilir misiniz? –

+0

Ve tabi ki bir JSch günlük dosyası ekleyin. –

cevap

5

onaylamak için stacktrace olması güzel olurdu rağmen, Sunucu kimlik doğrulaması için bir RSA 'ana makinesi' anahtar kullanılarak ve yanlış olduğunu edilir bahse girerim nadir durumlarda sıfır 'kırparak'. , Sabit uzunlukta bir sekizli dizesi olarak kodlanmış olması gerekmektedir SSH uses (SSL gibi birçok başka şeyler yapmak gibi) PKCS # 1 ile tanımlanan

RSA imza değerleri (ve ayrıca şifreli değerleri) eşit 'k' Modülü kodlamak için gerekli uzunluk veya gayri resmi 'modül ile aynı boyutta'. Bununla birlikte, temel matematiksel değer büyük ölçüde negatif olmayan (aka imzasız) bir tamsayı olduğundan, özellikle de modexp (s, d, n), tarihsel olarak bazı uygulamalar, sıfır oktetleri atlamamıştır - bu, değerini tamsayı olarak değerlendirirken geçerli olan bir ihmaldir. - bazen olması gerekenden daha kısa olan kodlanmış bir değerle sonuçlanır.

RSA imzası (veya şifrelenmiş) değeri, (1, n) 'de tekdüze rastgele bir sayıdır. Bu nedenle, sunucu tarafından kullanılan RSA anahtarının, burada olduğu gibi 1024 gibi bir 'yuvarlak ikili' boyutu olduğu zaman, bu kırpma , rastgele'da yaklaşık 200 kez, ya da imzalı bir sayı olarak kırpılmışsa 400 olacaktır.

bilmiyordum

ama (Oracle) Java 6 böyle bir 'kısa' değeri için Signature tip RSA kabul ya da aslında burada PKCS1-v1_5 düzeni ima ikisi de SHA1withRSA, kullanılan olmadığını teyit testlere Ancak Java 7 ve 8, gördüğünüz istisnai olarak'u atar. OTOH hem OpenSSH hem de PuTTY (WinSCP ve FileZilla tarafından da kullanılır) 'kısa' değerleri kabul ederken, her zaman doğru uzunluk değerlerini gönderir; Bu Posteli davranış, bir akranın bu şekilde yanlış davrandığını tespit etmeyi zorlaştırabilir. (Not: En eski ve en yeni olan OpenSSH 5.5 ve 7.3'ü kontrol ettim, ancak elimde sadece mevcut olan PuTTY 0.67 çünkü tüm bunlar çevrimiçi kalıyorum.)

Sunucu yazılımı uygulayıcısını yayınlanan standartlara işaret etmeyi deneyebilirsiniz. ama iyi bir şey yapmayabilir. Jcraft'a bunu özel duruma sorabilirsin; DSP ve ECDSA davalarında mpint/ASN.1 için mantığa sahipler.sunucu başka (kullanılabilir) anahtar varsa Ya ,"server_host_key" yapılandırarak dahil DEĞİL etmek istemek ssh-rsa - en kolay sadece mevcut/varsayılan liste, bölünmüş olsun muhtemelen "ssh-rsa" kaldırmak (ve boş değil kontrol edin) ve yeniden katılmak yerine Günümüzün özel algoritmalarını listeleyerek kullanıcılarınızı ve/veya (ko) kullanıcılarınızı kafa karıştırıcı.

+0

Cevabınız için teşekkürler. Size katılıyorum ve açıklamanız, programın davranışına çok uygun. –