2016-10-31 14 views
5

Java 1.8のアップグレード後に奇妙な問題に直面しています。私は、私たちのユーティリティプログラムの1つで、さまざまな場所からファイルをダウンロードするためにjsch-0.1.54.jarを使用しています。この特定のユーティリティは、問題なくほぼ4〜5年間使用されていました(それ以前はjsch-0.1.48)。その時の環境はJava 1.6でした。最近、我々はJava 1.8にアップグレードしました。その結果、この特定のユーティリティをアップグレードしました。今、私たちは奇妙な問題に遭遇しており、それは時折起こります。そして、ファイルのダウンロードが完全である時間がほとんどです。署名の長さが正しくない:127を取得しましたが、128を期待していました

エラーログ

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) 

成功ログ:(ほとんどの場合、それは成功である)

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 ../ 

私はバンダイク(SFTPのソフトウェアプロバイダ)との完全な分析を行ったが、いずれも見つかりませんでしたそのときのエラー。私はまた、さまざまなツールを使用してsftpしようとしましたが、私はエラーを取得していません。以下は、SFTPサーバーの接続のためのコードスニペットです。この問題で誰も助けることができますか?

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

サーバのように見えますが、Java 8でサポートされていない廃止された暗号化が使用されることがあります – maxpovver

+0

元の例外の呼び出しスタックを見つけることはできますか?(Session.java:565にキャッチされています) –

+0

もちろん、JSchログファイルを追加します。 –

答えて

5

確認するスタックトレースを持っていいだろうが、私は、サーバーを認証するためにRSA「ホスト」キーを使用して誤っているまれにゼロをリードする「トリミング」されて賭けます。

SSH uses(SSLを含む他の多くのものと同様に)であるRSA署名値(および暗号化された値も)は、固定長kのオクテット文字列として符号化する必要がありますモジュラスをエンコードするのに必要な長さ、または非形式的にはモジュラスと同じサイズです。しかし、基礎となる数学的な値は大きな非負(aka符号なし)の整数、具体的にはmodexp(s、d、n)であるため、いくつかの実装では先行するゼロオクテットが省略されています-を整数 - エンコードされた値が、時にはそれよりも短いことがあります。

RSA署名(または暗号化)値は事実上(1、n)の一様乱数です。したがって、サーバによって使用されるRSA鍵が1024のような「丸いバイナリ」サイズを有するとき、このトリミングは、ランダムに、または符号付き数としてトリミングされた場合には400回に約1回、になる。

私は知りませんでした

が、私は(オラクル)のJava 6がこのような「短い」値のためSignatureタイプRSAを受け入れるかのように、実際にここではPKCS1-v1_5のスキームを意味するものではどちらもSHA1withRSAを、使用しないことを確認するテストに、Java 7と8は例外を表示しています。 OTOH OpenSSHとPuTTY(WinSCPとFileZillaでも使用されています)は、常に「短」の値を受け入れます。正しい長さの値を送信します。このようなPostelianの振る舞いは、ピアがこのような振る舞いをしているときに検出することをより困難にする可能性があります。 (注:OpenSSH 5.5と7.3は、私が手元に持っている中で最も古いものと最新のものをチェックしましたが、現在のPuTTY 0.67だけがオンラインですので)。しかし、それは良いことをしないかもしれません。あなたはjcraftに特殊なケースを求めることができます。彼らはすでにmpint/ASN.1のDSAとECDSAのケースで論理がありますが、それは私も同じように醜いと主張するかもしれません。 またはサーバが別の(使用可能な)鍵を持っている場合、にを含まないように設定して要求してください - 既存の/デフォルトのリストを取得し、分割して"ssh-rsa"(そして空でないことを確認してください)今日の特定のアルゴリズムを一覧表示して、ユーザーや(共同)メンテナを混乱させる可能性があります。

+0

お返事ありがとうございます。私はあなたに同意し、あなたの説明はユーティリティの動作と非常に一致しています。 –

関連する問題