骆驼SFTP连接jcraft jsch异常
Camel SFTP connection jcraft jsch exception
我使用的是 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.access1(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
从异常消息来看,客户端和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-group1-sha1
我希望您会看到服务器列出的 none 个 KEX 算法在客户端列表中。基于此,您可以在服务器上启用其他 KEX 算法(前提是您有权访问它),或者您的客户端应用程序。有关更多信息,另请参阅 this page.
如果您无法对服务器进行更改,您可以通过以下两种方式之一添加对其他 KEX 算法的支持:
- 将 JSch 升级到最新版本 (0.1.52) 以自动启用对 sha256 的支持。
如果你坚持使用 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 密码,默认情况下 Oracle 的 JVM 不支持它。不过可以直接从Oracle.
下载
使用最新的 apache-camel 版本,例如 '1.21.5' 或 latest
我使用的是 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.access1(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
从异常消息来看,客户端和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-group1-sha1
我希望您会看到服务器列出的 none 个 KEX 算法在客户端列表中。基于此,您可以在服务器上启用其他 KEX 算法(前提是您有权访问它),或者您的客户端应用程序。有关更多信息,另请参阅 this page.
如果您无法对服务器进行更改,您可以通过以下两种方式之一添加对其他 KEX 算法的支持:
- 将 JSch 升级到最新版本 (0.1.52) 以自动启用对 sha256 的支持。
如果你坚持使用 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 密码,默认情况下 Oracle 的 JVM 不支持它。不过可以直接从Oracle.
下载使用最新的 apache-camel 版本,例如 '1.21.5' 或 latest