gpt4 book ai didi

java - 具有privateKeyFile的Apache Camel SFTP使用者提供了错误SSH_MSG_DISCONNECT:2协议(protocol)错误:找不到匹配的DH grp

转载 作者:行者123 更新时间:2023-11-29 04:34:27 24 4
gpt4 key购买 nike

无法使用带有私钥的Apache Camel访问SFTP位置。

SFTP URI:sftp://user@host: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 7一起使用。它可能与某些默认的安全提供程序设置有关。



查看堆栈跟踪的末尾,Camel正在使用JSch库提供基于SSH的FTP支持。知道这对于进一步的故障排除很有用,因为您可以查找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)提供,以指示其支持的功能。然后,服务器寻求最佳组。如果找不到满足这些条件的任何内容,则会断开并显示消息 no matching DH grp found

您可以在此IETF备忘中找到一些信息: https://tools.ietf.org/html/rfc4419。相关的一点:


  
  C向S发送“ min || n || max”,指示最小可接受的组大小,组的首选大小以及客户端将接受的最大组大小(以位为单位)。
  S找到最符合客户请求的组,并将“ p || g”发送给C。
  


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

那么该怎么办?首先,检查与您的私钥相对应的公钥的长度。然后向管理SFTP服务器的任何人请求有关受支持的密码算法,密钥交换算法和DH组的信息。服务器可能仅支持最小密钥比您使用的密钥长度更高的组。或反之亦然:客户端的公共密钥长于服务器支持的最大密钥。

如果服务器端的人是安装某些软件包的人,而他们却并不真正了解他们在做什么或正在配置,那么您可能很难获得信息。在那种情况下,通过进行网络数据包捕获(使用诸如Wireshark之​​类的工具),您可能会从服务器和客户端中找到有关受支持的密码和密钥交换算法的运气,但是要非常小心。您将希望获得上级的许可,因此不要误解为试图破坏安全措施或进行窃听。温和地说,在某些国家,有关此方面的法律及其解释有些愚蠢。

根据结果​​,服务器可能需要更新其OpenSSH版本,或为其他DH组配置它。或者您可能需要选择其他长度的钥匙。由于这可能会影响安全级别,因此您必须征得SFTP服务器操作员的许可以及为之从事项目的任何人。

看起来Camel允许您使用URI中的 ciphers选项来指定允许使用的加密密码。如果未指定,则使用JSch的默认列表。不幸的是,我没有看到指定使用哪种密钥交换算法的选项。看起来JSch确实支持许多交换算法(在密钥交换 http://www.jcraft.com/jsch/README下找到它)

尝试找出您的Camel版本使用哪个JSch版本。如果您可以更新Camel,并且较新的版本包含较新的JSch版本,请首先尝试。如果您无法更新,或者您已经在使用最新版本的Camel,请查看其中包含的JSch版本,以及是否可以在不中断工作的情况下将其替换为较新的版本。最新的JSch发行版可能支持旧版本不支持的版本,并且由于安全漏洞而更新和弃用某些算法和密钥长度,有时旧版本的客户端会拒绝使用最新的服务器(或其他方式)。

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

祝好运。我希望我能提供一个特定的解决方案,但是类似这样的问题通常需要SFTP服务器管理员和用户之间的通信才能解决,因为这需要了解双方的配置。

关于java - 具有privateKeyFile的Apache Camel SFTP使用者提供了错误SSH_MSG_DISCONNECT:2协议(protocol)错误:找不到匹配的DH grp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42273187/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com