Java 带有privateKeyFile的Apache Camel SFTP使用者出现错误SSH_MSG_DISCONNECT:2协议错误:未找到匹配的DH grp
无法使用带有私钥的Apache Camel访问SFTP位置 SFTP URI:Java 带有privateKeyFile的Apache Camel SFTP使用者出现错误SSH_MSG_DISCONNECT:2协议错误:未找到匹配的DH grp,java,apache-camel,sftp,jsch,Java,Apache Camel,Sftp,Jsch,无法使用带有私钥的Apache Camel访问SFTP位置 SFTP URI:sftp://user@主机:22/usr/users/me/inbox/myfolder/?privateKeyFile=ssk key.pem 确认密钥文件正确无误 错误: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://user@host:22
sftp://user@主机:22/usr/users/me/inbox/myfolder/?privateKeyFile=ssk key.pem
确认密钥文件正确无误
错误:
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://user@host: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
编辑:在尝试以下操作之前,首先检查正在运行的Java版本。如果是版本7或更早,请尝试升级到JRE 8,看看问题是否仍然存在。在回答这个问题之后,我遇到了这样一种情况:Java 7无法正常工作,而Java 8却可以正常工作。这可能与某些默认安全提供程序设置有关
查看堆栈跟踪的末尾,Camel正在使用JSch库来支持FTP over SSH。了解这一点对于进一步的故障排除非常有用,因为您可以查找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位
nbits
)和最大位数。这些数字由客户机(Camel中的JSch)提供,以指示它支持什么。然后,服务器寻找最佳组。如果找不到这些条件的任何匹配项,它将断开连接,并显示消息未找到匹配的DH grp
您可以在IETF备忘录中找到一些信息:。相关位:
ciphers
选项指定允许哪些加密密码。如果不指定,则使用JSch中的默认列表。不幸的是,我没有看到指定使用哪个密钥交换算法的选项。看起来JSch确实支持许多交换算法(在这里的密钥交换下找到了它:)
尝试找出您的Camel版本使用的JSch版本。如果您可以更新Camel,并且较新的版本包含较新的JSch版本,请首先尝试。如果您无法更新或已经使用最新版本的Camel,请查看包含了哪个版本的JSch,以及您是否可以在不破坏任何内容的情况下将其替换为新版本。最新的JSch版本可能支持旧版本所不支持的内容,并且由于安全漏洞,某些算法和密钥长度被更新和弃用,有时旧版本的客户端拒绝使用最新的服务器(或者相反)
还可以查看如何在JSch中启用日志记录(它似乎没有使用默认框架,如Log4j或java.util.logging),并尝试将系统属性javax.net.debug
设置为valueall
(例如,通过命令行参数-Djavax.net.debug=all
)。它可能会提供额外的信息
祝你好运。我希望我能提供一个具体的解决方案,但是像这样的问题通常需要SFTP服务器管理员和用户之间的通信来解决,因为这涉及到了解双方的配置