解决com.jcraft.jsch.JSchException: Algorithm negotiation fail
文章目录
- 一、背景:一个生产环境的ssh连接服务器报 Algorithm negotiation fail
- 二、问题根源
- 三、解决方案
- 3.1、引入 com.github.mwiede:jsch 替代原 JSch
- 3.2、为什么这个分支能解决问题?
一、背景:一个生产环境的ssh连接服务器报 Algorithm negotiation fail
最近在项目中需要从某台 Linux 服务器通过 ssh 连接服务器,代码中使用了经典的 JSch 库(版本 0.1.55)。然而,当部署到生产环境(Kylin Linux Advanced Server V10(sp4) )时,却突然抛出了一个致命错误:
com.jcraft.jsch.JSchException: Algorithm negotiation fail
搜索一番后发现,这个问题通常是由于 SSH 服务端禁用了旧版加密算法,而客户端(JSch)又不支持新算法导致的。网上清一色的建议是“升级 JSch 到最新版”,但尴尬的是——我用的已经是官方仓库最新的 0.1.55 了!
二、问题根源
服务端算法升级:现代 OpenSSH(我遇到问题的服务器SSH版本:OpenSSH_8.2p1)默认禁用 ssh-rsa、diffie-hellman-group1-sha1 等旧算法,而 JSch 的官方版本(0.1.55)仍未适配新算法(如 rsa-sha2-256)。
通过 ssh -V 命令可以查看服务器的ssh版本
JSch 的维护停滞:原 JSch 仓库(com.jcraft)更新缓慢,最后一次提交停留在Nov 26, 2018 ,导致无法及时支持新协议。
三、解决方案
在尝试了调整服务端配置、强制指定算法等方法均告失败后,最终通过 替换依赖库 彻底解决问题。
具体步骤如下:
3.1、引入 com.github.mwiede:jsch 替代原 JSch
这个分支由开源社区维护,修复了官方库的许多兼容性问题,且支持新算法。
Maven 配置
<!-- https://mvnrepository.com/artifact/com.github.mwiede/jsch --><dependency><groupId>com.github.mwiede</groupId><artifactId>jsch</artifactId><version>0.2.24</version></dependency>
Gradle 配置
implementation 'com.github.mwiede:jsch:0.2.24'
3.2、为什么这个分支能解决问题?
算法支持增强:该分支主动适配了 OpenSSH 8.x+ 的服务端,支持 rsa-sha2-256/512 等新算法。
持续维护:社区开发者定期修复问题,例如 Issue #45 明确提到解决了与最新 OpenSSH 的兼容性。