无法修改sshd文件时如何解决JSch算法协商失败问题
SFTP对接JSch算法协商失败解决方案
报错信息
com.jcraft.jsch.JSchException: Algorithm negotiation fail at com.jcraft.jsch.Session.receive_kexinit(Session.java:590) at com.jcraft.jsch.Session.connect(Session.java:320) at com.jcraft.jsch.Session.connect(Session.java:183) at com.cashfree.common.dexterreport.sftp.SftpClient.getSftpChannel(SftpClient.java:82)
问题约束
- 常规修改服务端
sshd_config开放兼容算法的方案不适用:业务部署在远程环境,且需要对接大量配置各异的外部客户端,无法逐个调整对端服务端配置 - 已尝试升级原生JSch到0.1.55版本,运行环境为Java 11,问题未解决
- 待验证方案包括mwiede提供的JSch修复分支、升级wagon ssh版本,需要确认方案可行性
落地可行方案
1. 优先替换为mwiede维护的JSch分支(推荐生产使用)
这个分支是原生JSch停更后,社区公认的生产级替代方案,安全性和健壮性有充分保障:
- 完全兼容原生JSch所有API,替换时仅需修改依赖坐标,不需要调整任何业务代码,迁移成本极低
- 默认内置全量新老版本SSH协议的密钥交换、加密、签名、MAC算法,连接时自动和对端协商匹配的算法,不需要修改服务端配置,可适配大量配置不同的外部SFTP服务端
- 目前已经被Spring Integration、Apache Camel等多个主流开源项目的SFTP组件作为默认依赖,迭代维护流程公开透明,经过大规模生产环境验证
2. 间接依赖JSch场景同步升级wagon-ssh版本
如果项目是通过Maven Wagon组件间接引入JSch,直接修改JSch依赖版本不会生效:旧版本wagon-ssh会强制拉取老旧版本JSch,导致算法兼容问题。将wagon-ssh升级到2.12及以上版本即可,该版本默认依赖上述mwiede维护的JSch版本,升级后无需额外代码调整即可解决协商失败问题。
3. 临时应急方案(不推荐长期使用)
如果短期内无法替换依赖,可以在创建JSch Session对象前,手动配置全量兼容算法列表,覆盖JSch默认的算法配置。但该方案需要随着SSH算法的淘汰持续更新维护列表,长期使用成本高,仅适合临时排障使用。
内容的提问来源于stack exchange,提问作者ss13199
相关产品推荐
相关产品推荐

