Spring Integration SFTP连接失败:无法协商密钥交换算法的解决方案求助
Spring Integration SFTP连接失败:无法协商密钥交换算法的解决方案求助
嘿,这个问题我之前帮同事排查过,刚好能给你支招!你遇到的是Spring Integration底层依赖的Apache SSHD默认只启用了安全性更高的现代密钥交换算法,但你的SFTP服务器还停留在旧的SHA1系算法上,导致协商失败。给你两个实用的解决办法:
方法一:在代码中自定义SSH客户端配置(推荐)
你可以通过DefaultSftpSessionFactory的setClientConfigurer方法,手动添加服务器支持的旧密钥交换算法,这样客户端就能和服务器成功协商了。修改后的代码如下:
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(); factory.setHost("ftp.sssss.com"); factory.setPort(22); factory.setAllowUnknownKeys(true); factory.setUser("user"); factory.setPassword("password"); // 自定义SSH客户端的密钥交换算法,添加服务器支持的旧算法 factory.setClientConfigurer(client -> { client.setKeyExchangeFactories(List.of( // 对应服务器支持的diffie-hellman-group1-sha1 new org.apache.sshd.kex.DHG1.Factory(), // 对应服务器支持的diffie-hellman-group14-sha1 new org.apache.sshd.kex.DHG14.Factory() // 可选:保留原有现代算法,优先尝试更安全的选项 // new org.apache.sshd.kex.Curve25519SHA256.Factory(), // ...其他默认算法 )); }); SftpSession sftpSession = factory.getSession();
这段代码的核心是通过客户端配置器,把服务器支持的两种旧算法对应的工厂类加入到密钥交换列表中,这样客户端发起连接时就会尝试用这些算法和服务器协商。
方法二:通过JVM参数全局配置(无需修改代码)
如果你不想改动代码,可以在启动应用时添加JVM系统参数,强制Apache SSHD启用这些旧算法:
-Dorg.apache.sshd.kex=diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,curve25519-sha256,curve25519-sha256@libssh.org
这里把服务器支持的算法和原有现代算法放在一起,客户端会优先尝试安全的现代算法,失败后再回退到旧算法。
注意事项
虽然这两种方法能解决连接问题,但diffie-hellman-group1-sha1这类算法的安全性已经很低了,强烈建议你联系SFTP服务器的管理员,升级服务器配置,启用更安全的密钥交换算法(比如你客户端默认支持的curve25519系列),从根源上解决安全隐患。
备注:内容来源于stack exchange,提问作者Do Will
相关产品推荐
相关产品推荐

