1

camel バージョン 2.13.1 と camel-ftp バージョン 2.13.1 を使用しています。camel ルート経由で sftp サーバーに接続しようとしています。以下に示すように、jCraft Jsch 例外に関連するエラーが発生します。

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://uname@serveraddress.com:22
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:143)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary(RemoteFileConsumer.java:154)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.recoverableConnectIfNecessary(RemoteFileConsumer.java:145)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.prePollCheck(RemoteFileConsumer.java:55)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:106)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(Unknown Source)
    at java.util.concurrent.FutureTask.runAndReset(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
Caused by: com.jcraft.jsch.JSchException: Algorithm negotiation fail
    at com.jcraft.jsch.Session.receive_kexinit(Session.java:582)
    at com.jcraft.jsch.Session.connect(Session.java:320)
    at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:115)
    ... 14 more
4

2 に答える 2

4

例外メッセージから判断すると、クライアントと SSH サーバー間に共有鍵交換 (KEX) アルゴリズムが存在しないようです。これは、接続を試みる前に JSch でログインを有効にすることで確認できます。

JSch.setLogger(new Logger() {
    @Override
    public boolean isEnabled(int i) {
        return true;
    }
    @Override
    public void log(int i, String string) {
        System.out.println(string);
    }
};

これにより、サーバーとクライアントでそれぞれサポートされている KEX のリストが出力されます。例えば:

kex: サーバー: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1, diffie-hellman-group1-sha1

サーバーによってリストされた KEX アルゴリズムがクライアント リストにないことがわかると思います。これに基づいて、サーバー (アクセスできる場合) またはクライアント アプリケーションで追加の KEX アルゴリズムを有効にすることができます。詳しくはこちらのページもご覧ください。

サーバーを変更できない場合は、次の 2 つの方法のいずれかで追加の KEX アルゴリズムのサポートを追加できます。

  1. JSch を最新リリース (0.1.52) にアップグレードして、sha256 のサポートを自動的に有効にします。
  2. 0.1.51 で行き詰まっている場合は、プログラムで sha256 を有効にすることができます。

    JSch shell = new JSch();
    Properties config = new Properties();
    config.put("kex", "diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256");
    config.put("StrictHostKeyChecking", "no");
    

次に、セッションを作成し、次のように構成を設定します。

Session session = ...
session.setConfig(config);

更新: この場合、アルゴリズムの欠落ではなく、サイファーの欠落であることが判明しました。サーバーは aes256-cbc cypher のみをサポートしていましたが、これはデフォルトでは Oracle の JVM ではサポートされていません。ただし、 Oracleから直接ダウンロードできます。

于 2015-05-04T17:01:25.877 に答える
0

「1.21.5」または最新のような最新の apache-camel バージョンを使用します

于 2019-03-06T20:23:54.333 に答える