JSch使用私钥进行SSH认证失败(Auth fail错误)求助
JSch使用私钥进行SSH认证失败(Auth fail错误)求助
兄弟,看你遇到JSch用私钥SSH认证失败的问题了,结合你贴的日志片段,我整理了几个大概率能解决问题的排查方向,你可以一个个试试:
先把你提供的日志贴出来方便大家分析:
JSch Log [level 1]: Connecting to 10.***.150 port 22 JSch Log [level 1]: Connection established JSch Log [level 1]: Remote version string: SSH-2.0-OpenSSH_8.7 JSch Log [level 1]: Local version string: SSH-2.0-JSCH-0.1.54 JSch Log [level 1]: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256 JSch Log [level 1]: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521 JSch Log [level...
JSch版本太老,兼容性拉胯
你日志里的JSch版本是0.1.54,这版本都快成古董了!而远端是OpenSSH 8.7,新版本OpenSSH默认禁用了好多老算法,比如你日志里JSch支持的diffie-hellman-group14-sha1,在新OpenSSH里早就被踢到黑名单了。赶紧升级JSch到最新稳定版(比如0.1.55及以后),新版本适配了现代SSH的加密标准,这应该是最容易解决问题的办法。私钥相关的格式&权限要盯紧
- 先看私钥格式:如果你的私钥是新的OpenSSH格式(开头是
-----BEGIN OPENSSH PRIVATE KEY-----),老JSch根本不认,得转换成传统PEM格式,用命令ssh-keygen -p -m PEM -f /path/to/your/private_key就能转。 - 再看权限:Linux/macOS下私钥文件权限必须是600(
chmod 600 你的私钥路径),权限太松SSH直接拒你没商量;服务器端的~/.ssh/authorized_keys文件也要设成600,所在的.ssh目录设成700,权限不对认证必败。 - 最后确认:服务器的
authorized_keys里确实加了对应私钥的公钥,别搞混了其他私钥的公钥!
- 先看私钥格式:如果你的私钥是新的OpenSSH格式(开头是
手动指定兼容的密钥交换算法
如果暂时不想升级JSch,那试试在代码里手动指定JSch和服务器都支持的Kex算法,比如:JSch jsch = new JSch(); Properties config = new Properties(); // 选几个老JSch和OpenSSH8.7都支持的算法 config.put("kex", "diffie-hellman-group14-sha256,ecdh-sha2-nistp256"); Session session = jsch.getSession("你的用户名", "服务器地址", 22); session.setConfig(config);同时要确保服务器的
sshd_config里启用了这些算法,比如加一行KexAlgorithms +diffie-hellman-group14-sha256,然后重启sshd服务。别忘了私钥的密码保护
如果你的私钥设了密码(passphrase),那代码里必须处理密码输入啊!比如实现JSch的UserInfo接口来提供密码,不然JSch解不开私钥,自然认证失败。
备注:内容来源于stack exchange,提问作者Lojini
相关产品推荐
相关产品推荐

