You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 21:34:55