使用j2ssh连接SSH报错TransportProtocolException的问题排查
解决j2ssh-core-0.2.9密钥交换算法不兼容问题
我之前踩过j2ssh-core-0.2.9这个老库的坑,正好碰到过密钥交换算法不匹配的问题,给你两个实用的解决方向:
方向一:临时调整SSH服务器配置,兼容旧算法
如果你的服务器允许修改配置,可以先临时开启客户端支持的过时算法,让连接先跑起来:
- 打开SSH服务器的配置文件(通常是
/etc/ssh/sshd_config) - 添加或修改
KexAlgorithms配置项,把客户端仅支持的diffie-hellman-group1-sha1追加到服务器的算法列表里:KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1 - 重启SSH服务(比如执行
systemctl restart sshd或者service ssh restart,根据你的操作系统而定) - 再尝试用j2ssh连接,应该就能匹配到可用的密钥交换算法了
注意:这只是临时的权宜之计,
diffie-hellman-group1-sha1是安全性较低的过时算法,长期使用会有风险,不建议一直开启。
方向二:升级/替换老旧的j2ssh库
j2ssh-core-0.2.9是2006年左右的版本,已经停止维护十几年了,根本不支持任何现代的密钥交换算法,最彻底的解决办法是换用活跃维护的SSH客户端库:
- 推荐JSch:这是一款维护周期很长的SSH库,支持绝大多数现代SSH算法,上手成本也低
- 或者Apache MINA SSHD:Apache旗下的活跃项目,功能齐全,支持最新的SSH协议特性
给你贴个简单的JSch连接示例,用来替代j2ssh的逻辑:
import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; public class SSHDemo { public static void main(String[] args) { JSch jsch = new JSch(); try { Session session = jsch.getSession("你的用户名", "服务器地址", 22); session.setPassword("你的密码"); // 生产环境建议配置已知主机密钥,这里为了测试跳过验证 session.setConfig("StrictHostKeyChecking", "no"); session.connect(); System.out.println("连接成功!"); session.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
补充说明
你用ssh -Q kex查看服务器支持算法的方法很对,能快速定位客户端和服务器的算法交集。但j2ssh这个旧版本的局限性实在太大,没有适配新算法的可能,所以长远来看替换库才是最优解。
内容的提问来源于stack exchange,提问作者pep8
相关产品推荐
相关产品推荐

