2017-02-16 4 views
1

プライベートキーを使用してApache Camelを使用してSFTPの場所にアクセスできません。Apache Camelプライベートキーファイルを持つSFTPコンシューマにエラーが発生するSSH_MSG_DISCONNECT:2プロトコルエラー:一致するDH grpが見つかりません

SFTP URI:sftp://[email protected]:22/usr/users/me/inbox/myfolder/?privateKeyFile=ssk-key.pem

キーファイルが正しいことが確認されました。

エラー:

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://[email protected]:22 
       at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146) 
       at org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary(RemoteFileConsumer.java:203) 
       at org.apache.camel.component.file.remote.SftpConsumer.doStart(SftpConsumer.java:52) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.impl.DefaultCamelContext.startService(DefaultCamelContext.java:3269) 
       at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRouteConsumers(DefaultCamelContext.java:3563) 
       at org.apache.camel.impl.DefaultCamelContext.doStartRouteConsumers(DefaultCamelContext.java:3499) 
       at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3429) 
       at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3197) 
       at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3053) 
       at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:175) 
       at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2848) 
       at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:2844) 
       at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:2867) 
       at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:2844) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:2813) 
       at org.apache.camel.main.Main.doStart(Main.java:127) 
       at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) 
       at org.apache.camel.main.MainSupport.run(MainSupport.java:138) 
       at org.apache.camel.main.MainSupport.run(MainSupport.java:390) 
       at com.me.mypackage.MainApp.main(MainApp.java:27) 
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
       at java.lang.reflect.Method.invoke(Method.java:606) 
       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 Protocol error: no matching DH grp found 
       at com.jcraft.jsch.Session.read(Session.java:996) 
       at com.jcraft.jsch.Session.connect(Session.java:323) 
       at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:118) 
       ... 26 more 

答えて

3

EDIT:、以下のあなたが実行しているJavaのバージョン最初のチェックをしようとする前に。バージョン7以前の場合は、JRE 8にアップグレードして問題が解決されないかどうか確認してください。これに答えて以来、私はJava 7で動作することを拒否したが、8で正常に動作する状況に遭遇しました。これは、デフォルトのセキュリティプロバイダ設定と関係があります。


スタックトレースの終わりを見て、CamelはFTP over SSHサポートにJSchライブラリを使用しています。 JSchでどのキー交換アルゴリズムがサポートされているかを調べることができるため、これを知ることはさらにトラブルシューティングに役立ちます。

クライアントがサーバーとの安全な接続を確立しようとすると、サポートされているアルゴリズムの一覧が交換され、クライアントとサーバーの両方でサポートされているアルゴリズムがわかります。次に、鍵交換のためのアルゴリズムが選択される。

SFTPサーバーは、サーバーから返されたエラーメッセージによって、OpenSSHを使用している可能性が最も高いと判断します。エラーメッセージは、サーバーが切断を返された部分は、OpenSSHのソースにここにある:

kex->dh = PRIVSEP(choose_dh(min, nbits, max)); 
if (kex->dh == NULL) { 
    sshpkt_disconnect(ssh, "no matching DH grp found"); 
    r = SSH_ERR_ALLOC_FAIL; 
    goto out; 
} 

「DHのGRPは、」のDiffie-Hellmanグループを意味しています。 Diffie-Hellmanは、公開鍵交換の方法です。グループによって、サポートされているキー長が決まります。いくつかの例:

  • グループ1:768ビット
  • グループ2:1024ビット
  • グループ5:1536ビット
  • グループ14:2048ビット
  • において

DHグループが最小ビット数、優先ビット数(nbits)と最大ビット数を検索されていることに気が付きました。これらの数字は、サポートするものを示すためにクライアント(CamelのJSch)によって提供されます。次に、サーバーは最適なグループを探します。これらの条件に該当するものが見つからない場合は、メッセージno matching DH grp foundで切断されます。

このIETFメモには、https://tools.ietf.org/html/rfc4419の情報があります。関連するビット:

  1. C sends "min || n || max" to S, indicating the minimal acceptable group size, the preferred size of the group, and the maximal group size in bits the client will accept.

  2. S finds a group that best matches the client's request, and sends "p || g" to C.

Cはクライアントであり、Sはサーバーです。

だから、どうしたらいいですか?まず、秘密鍵に対応する公開鍵の長さを確認します。次に、サポートされている暗号アルゴリズムに関する情報,鍵交換アルゴリズムおよびDHグループに関する情報を、SFTPサーバーを管理する人から要求します。サーバーは、使用しているキーの長さよりも小さい最小キーを持つグループのみをサポートしている可能性があります。逆に、クライアントの公開鍵がサーバーでサポートされている最大長を超えています。

サーバー側の人が、何をしているのか、設定しているのかを実際に理解していないパッケージをインストールするタイプの人は、情報を取得するのが難しい場合があります。その場合、(Wiresharkなどのツールを使用して)ネットワークパケットのキャプチャを行うことによって、サーバとクライアントの両方からサポートされている暗号と鍵交換アルゴリズムについて知ることができますが、これには非常に注意してください。あなたは上司の許可を得て、セキュリティ対策や盗聴を打ち負かそうとしていると誤解されることはありません。これに関する法律とその解釈は、一部の国では軽度に言わせると、ややばかげている。

結果に応じて、サーバーはOpenSSHバージョンを更新するか、追加のDHグループ用に構成する必要があります。または異なる長さのキーを選択する必要があります。それがセキュリティのレベルに影響するかもしれないので、あなたはSFTPサーバのオペレータとあなたがプロジェクトをやっている人の許可を求めなければなりません。

Camelでは、URIのciphersオプションを使用して、許可する暗号化暗号を指定できるようです。これを指定しないと、JSchのデフォルトリストが使用されます。残念ながら、使用する鍵交換アルゴリズムを指定するオプションはありません。 JSchは多くの交換アルゴリズムをサポートしているようです(鍵交換でここにあります:http://www.jcraft.com/jsch/README

Camelのバージョンが使用するJSchのバージョンを調べてみてください。 Camelを更新でき、新しいバージョンに新しいJSchバージョンが含まれている場合は、まずそれを試してみてください。最新版のCamelを更新できない場合は、含まれているJSchのバージョンと、新しいリリースと置き換えることができるかどうかを確認してください。最新のJSchリリースでは古いものがサポートしていない可能性があり、セキュリティの脆弱性による特定のアルゴリズムや鍵長の更新や廃止により、古いバージョンのクライアントは最新のサーバでの動作を拒否することがありますまたは他の方法で)。

JSchのログを有効にする方法(Log4jやjava.util.loggingなどのデフォルトのフレームワークを使用していないようです)を確認し、システムプロパティjavax.net.debugを値allに設定してみてくださいコマンドラインパラメータ-Djavax.net.debug=all)。それは余分な情報を提供するかもしれません。

幸運。具体的な解決策を提供したいと思いますが、SFTPサーバー管理者とユーザーの間で通信を行う必要があることがよくあります。両者の構成を把握する必要があるためです。

関連する問題