Camel SFTP连接jcraft jsch异常

时间:2015-05-04 15:08:35

标签: apache-camel jsch camel-ftp

我使用的是camel版本2.13.1和camel-ftp版本2.13.1。我试图通过驼峰路由连接到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

2 个答案:

答案 0 :(得分: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:server: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-组1-SHA1

我希望你会发现服务器列出的所有KEX算法都不在客户端列表中。在此基础上,您可以在服务器上启用其他KEX算法(前提是您可以访问它),或者启用客户端应用程序。有关更多信息,请参阅this page

如果无法对服务器进行更改,可以通过以下两种方式之一添加对其他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");
    
  3. 然后创建会话并使用以下命令设置配置:

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

    更新: 在这种情况下,结果证明这不是一个缺失的算法,而是一个缺失的密码。服务器仅支持aes256-cbc cypher,Oracle的JVM默认不支持该cypher。但是,它可以直接从Oracle下载。

答案 1 :(得分:0)

使用最新的apache-camel版本,例如'1.21.5' latest