问题描述
环境:jdk1.6 + jsch-0.1.52.jar + openSSH7.4
升级openSSH到7.4后jsch报错:End of IO Stream Read* 或者报错:Algorithm negotiation fail*。

*注:
End of IO Stream Read:jdk1.6支持加密算法太少,导致报文无法正确解析。
Algorithm negotiation fail:客户端指定的加密算法openSSH不支持。

问题分析

1、网上说的jsch-0.1.52.jar不支持openSSH7.4版本的说法不靠谱,jsch-0.1.52.jar也是能正常访问的。

2、真正的原因是jdk1.6支持的加密算法和openSSH7.4声明支撑的加密算法不一致导致的。

jdk1.6支持的加密算法较少,openSSH7.4默认屏蔽了jdk1.6支持的加密算法,如:diffie-hellman-group1-sha1等。

解决思路是:要么升级jdk,让jdk支持更多加密算法,要么通过修改/etc/ssh/sshd_config配置文件让openSSH7.4支持更多的加密算法。

问题解决

方案一(jdk升级到jdk8,openSSH配置文件不变,亲测可用)

1、将jdk升级到jdk8即可
注意:
因为有的地方会说要在代码中指定diffie-hellman-group1-sha1算法(详见方案二),这里千万不要画蛇添足。
该方案从升级jdk入手,jdk8支持了大多数加密算法。该方案不需要修改任何配置文件。

方案二(保持jdk1.6,修改openSSH配置文件,亲测可用)

1、修改/etc/ssh/sshd_config配置文件,添加jdk1.6支持的加密算法,如下:

# 编辑sshd_config
vim /etc/ssh/sshd_config

# 添加1.6的加密算法
 KexAlgorithms +diffie-hellman-group1-sha1
 
# 重启sshd
/etc/init.d/sshd restart

注意:
如果用的是jsch-0.1.52 jar包,按上述方法修改完即可。
如果用的是jsch-0.1.53及以上jar包,还需要对代码做如下修改:
修改代码,在session中指定加密算法为:diffie-hellman-group1-sha1,如下所示:

Properties sshConfig = new Properties();
sshConfig.put("kex", "diffie-hellman-group1-sha1");

这是为什么呢?
因为,建立连接时openSSH会把它支持的所有加密算法发给jsch,让jsch从中挑选一个(如果不清楚SSH连接,请先了解SSH建立原理)。
如果列表中有diffie-hellman-group1-sha1算法,jsch-0.1.52则会优先选择该算法(如果没有则任选一个,如果jdk不支持选择的算法,就会报错),这个算法恰好是jdk1.6支持的,所以连接成功。而jsch-0.1.53及以后的jar包默认选择其他算法(具体是什么还需确认),该算法jdk1.6不支持,所以报错。
如果要使用jsch-0.1.53及以后的jar包,就需要在代码中指定使用diffie-hellman-group1-sha1算法。

方案三(未测试。该方法不用升级jdk,只需安装扩展包)
1、安装java安全插件:Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy Files。
安装方法参考:http://blog.csdn.net/csnewdn/article/details/53641308
对应版本如下:

jdk版本对应插件名称下载地址
jdk6Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
jdk7 http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7
jdk8Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐