Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有privateKeyFile的Apache Camel SFTP使用者出现错误SSH_MSG_DISCONNECT:2协议错误:未找到匹配的DH grp_Java_Apache Camel_Sftp_Jsch - Fatal编程技术网

Java 带有privateKeyFile的Apache Camel SFTP使用者出现错误SSH_MSG_DISCONNECT:2协议错误:未找到匹配的DH grp

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

无法使用带有私钥的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
                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位
在上面的C代码位中,您注意到DH组搜索的是最小位数、首选位数(
nbits
)和最大位数。这些数字由客户机(Camel中的JSch)提供,以指示它支持什么。然后,服务器寻找最佳组。如果找不到这些条件的任何匹配项,它将断开连接,并显示消息
未找到匹配的DH grp

您可以在IETF备忘录中找到一些信息:。相关位:

  • C向S发送“min | | n | | max”,指示最小可接受组大小、组的首选大小以及客户端将接受的最大组大小(以位为单位)

  • S找到最符合客户请求的组,并将“p | | g”发送给C

  • C是客户端,S是服务器

    那么,该怎么办?首先,检查与私钥对应的公钥的长度。然后向管理SFTP服务器的人员请求有关支持的密码算法密钥交换算法DH组的信息。服务器可能只支持最小密钥高于您正在使用的密钥长度的组。或者反过来说:客户端的公钥比服务器支持的最大值长

    如果服务器端的人员安装了一些软件包,而没有真正了解他们在做什么或配置什么,那么您可能很难获得信息。在这种情况下,通过网络数据包捕获(使用Wireshark之类的工具),您可能会幸运地从服务器和客户端找到受支持的密码和密钥交换算法,但要非常小心。你需要得到上司的许可,这样才不会被误解为试图挫败安全措施或窃听。委婉地说,有些国家的法律及其解释有点愚蠢

    根据结果,服务器可能需要更新其OpenSSH版本,或者为其他DH组配置它;或者您需要选择不同长度的键。因为这可能会影响安全级别,所以您必须寻求SFTP服务器的运营商以及您为其执行项目的任何人的许可

    看起来Camel允许您使用URI中的
    ciphers
    选项指定允许哪些加密密码。如果不指定,则使用JSch中的默认列表。不幸的是,我没有看到指定使用哪个密钥交换算法的选项。看起来JSch确实支持许多交换算法(在这里的密钥交换下找到了它:)

    尝试找出您的Camel版本使用的JSch版本。如果您可以更新Camel,并且较新的版本包含较新的JSch版本,请首先尝试。如果您无法更新或已经使用最新版本的Camel,请查看包含了哪个版本的JSch,以及您是否可以在不破坏任何内容的情况下将其替换为新版本。最新的JSch版本可能支持旧版本所不支持的内容,并且由于安全漏洞,某些算法和密钥长度被更新和弃用,有时旧版本的客户端拒绝使用最新的服务器(或者相反)

    还可以查看如何在JSch中启用日志记录(它似乎没有使用默认框架,如Log4j或java.util.logging),并尝试将系统属性
    javax.net.debug
    设置为value
    all
    (例如,通过命令行参数
    -Djavax.net.debug=all
    )。它可能会提供额外的信息

    祝你好运。我希望我能提供一个具体的解决方案,但是像这样的问题通常需要SFTP服务器管理员和用户之间的通信来解决,因为这涉及到了解双方的配置