spring-integration-sftp v6.1.2升级后报Server key did not validate异常
问题分析
从日志能明确定位核心矛盾:
- 服务器返回的密钥类型为
ssh-dss(日志行:setServerKey(...) keyType=ssh-dss) - 你的
known_hosts文件中仅存储了该服务器的ssh-rsa类型公钥
Spring Integration SFTP 6.1.2依赖的Apache MINA SSHD版本较5.2.3大幅升级,新版本SSHD客户端在密钥协商过程中,可能优先选择服务器提供的DSS密钥做验证,但本地known_hosts无对应记录,导致验证失败。而设置AcceptAllServerKeyVerifier跳过验证后,自然不会触发该错误。
解决方案
方案1:更新known_hosts文件,添加服务器DSS公钥
直接获取服务器的ssh-dss类型公钥并追加到现有known_hosts文件:
ssh-keyscan -t dss sfeg.test.ag.test.group.ca >> /known_hosts/sfeg-public-key
执行后,known_hosts会同时包含该服务器的RSA和DSS公钥,验证时就能匹配服务器返回的ssh-dss密钥。
方案2:强制客户端优先使用RSA密钥验证
修改SshClient配置,指定服务器密钥算法优先级,让客户端优先选择ssh-rsa类型密钥验证:
SshClient sshClient = SshClient.setUpDefaultClient(); // 新增配置:指定服务器密钥算法顺序 sshClient.setServerKeyAlgorithms(Collections.singletonList("ssh-rsa")); // 其余原有配置保持不变 sshClient.setKeyExchangeFactories(NamedFactory.setUpTransformedFactories( false, BuiltinDHFactories.VALUES, ClientBuilder.DH2KEX )); // ...后续配置代码
这样客户端会要求服务器提供ssh-rsa类型密钥,与现有known_hosts中的记录匹配,即可通过验证。
方案3:补充DSS签名算法支持(可选)
如果需要保留DSS密钥的支持,确保SshClient的签名工厂包含DSS相关算法:
sshClient.setSignatureFactories(Arrays.asList( BuiltinSignatures.rsa, BuiltinSignatures.dss, BuiltinSignatures.rsaSHA256, BuiltinSignatures.rsaSHA512 ));
注意:此方案仅解决算法支持问题,核心仍需保证known_hosts中有对应类型的密钥记录。
验证建议
修改配置后重启应用,观察日志中是否出现checkKeys(...) verified=true的行,若出现则说明服务器密钥验证通过。
内容的提问来源于stack exchange,提问作者jianmin tu
相关产品推荐
相关产品推荐

