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

使用JSch对接libssh服务器时rsa-sha2-512认证失败求助

解决方案

1. 强制JSch使用传统ssh-rsa签名算法

旧SFTP服务器大概率禁用了rsa-sha2系列算法,只支持原始的ssh-rsa。你需要在JSch配置里指定优先用ssh-rsa:

JSch jsch = new JSch();
// 加载本地私钥文件
jsch.addIdentity("/Users/yourname/.ssh/id_rsa");
Session session = jsch.getSession("sftp_user", "old-sftp-server.com", 22);

// 配置认证规则
Properties config = new Properties();
config.put("PreferredAuthentications", "publickey");
// 把ssh-rsa强制加入允许的公钥算法列表
config.put("PubkeyAcceptedAlgorithms", "+ssh-rsa");
// 同时兼容ssh-rsa和ssh-dss主机密钥
config.put("server_host_key", "ssh-rsa,ssh-dss");
session.setConfig(config);

session.connect();

2. 检查私钥格式

确保你的私钥是OpenSSH兼容的PEM格式,新生成的密钥可能是PKCS#8格式,JSch对旧格式支持更好。转换命令:

ssh-keygen -p -f /Users/yourname/.ssh/id_rsa -m PEM

转换后再在代码里加载这个私钥。

3. 临时禁用主机密钥严格检查(仅测试用)

如果确认服务器主机密钥是ssh-dss但JSch还是识别失败,可以临时关掉严格检查排查问题(生产环境别这么做):

config.put("StrictHostKeyChecking", "no");

4. 降级JSch版本(备选方案)

mwiede:jsch:0.2.5对旧算法的支持可能有改动,试试降级到经典的com.jcraft:jsch:0.1.55(注意groupId不一样),旧版本默认支持ssh-rsa,兼容性更好。

5. 确认服务器支持的算法

用ssh命令查服务器接受的公钥算法,确保配置匹配:

ssh -v sftp_user@old-sftp-server.com -p 22

看日志里的debug1: Server accepts key:行,找到服务器认可的算法,然后对应调整JSch的PubkeyAcceptedAlgorithms配置。


内容的提问来源于stack exchange,提问作者jka_dk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:20:42