使用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
相关产品推荐
相关产品推荐

