文章

解决使用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'

替换完成之后,重新编译项目即可。至此启动项目,映射成功。

五、参考文献

License:  CC BY 4.0