解决使用Jsch SSH连接 Auth Fail的问题
一、项目背景
半年前因为业务需要,用Java
开发了一个服务器端口映射的小工具(大白话:就是把服务器上的端口映射到本地端口进行转发)类似于macOS的Core Tuunel,代码中使用了经典的Jsch
库(版本 0.1.55
)。之前一直正常使用没有问题,这次需要新增映射的服务器,配置完成之后发现鉴权总是失败,但是通过SSH客户端都是能正常访问。
具体报错信息如下:
com.jcraft.jsch.JSchException: Auth fail
二、探索之路
因为以前有过类似的项目经验,第一步怀疑的就是加密算法的问题,之前有过JDK版本过低导致进行部分https请求的时候一直报证书异常,原因就是低版本的JDK不支持部分加密算法导致,后续更换高版本的JDK就可以了。我立马检查项目的JDK版本,发现版本并不,使用的是JDK17
,遂排除是这个原因导致。
那既然不是JDK版本的问题,那么就只能怀疑使用的Jsch库了,通过查看Jsch
仓库代码,发现其更新缓慢,最后一次提交停留在Nov 26 2018
(就是我使用的0.1.55
版本)。现在都2025年了,算法早已更新换代了,所以大概率是这个问题了。
三、问题根源
围绕上面的猜想,进行了一系列排查,最后锁定了问题根源:
服务端算法升级:现代 OpenSSH(我遇到问题的服务器SSH版本:OpenSSH_8.2p1)默认禁用 ssh-rsa、diffie-hellman-group1-sha1 等旧算法,而 Jsch 的官方版本(0.1.55)仍未适配新算法(如 rsa-sha2-256)
Jsch 的维护停滞:原 Jsch 仓库(com.jcraft)更新缓慢,最后一次提交停留在Nov 26, 2018 ,导致无法及时支持新协议。
四、解决方案
在尝试了调整服务端配置、强制指定算法等方法均告失败后,最终通过(替换依赖库)来彻底解决问题。
具体步骤如下:
1. 引入 com.github.mwiede:jsch 替代原 Jsch
这个分支由开源社区维护,修复了官方库的许多兼容性问题,且支持新算法。
算法支持增强:该分支主动适配了 OpenSSH 8.x+
的服务端,支持 rsa-sha2-256/512
等新算法。
持续维护:社区开发者定期修复问题,例如 Issue #45
明确提到解决了与最新 OpenSSH
的兼容性。
Maven 配置
<!-- jsch社区版 -->
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.2.0</version>
</dependency>
Gradle 配置
implementation 'com.github.mwiede:jsch:0.2.0'
替换完成之后,重新编译项目即可。至此启动项目,映射成功。