问题描述
环境: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
2)上网搜寻这个错误,发现国内遇到这个问题不多。国外stackoverflow网站上有贴出一样的报错,但是引用的jar版本不同,并且答案指出升级到jsch-0.1.54问题就不存在了。1)经过多次测试,排查问题。推测是环境ssh版本问题,由于客户环境不可见,无法获得sftp服务器ssh的版本。在sftp登录时,设置完ip,port,user和pwd之后。3)小心测试,解决问题。 JSch 是SSH2的一个纯Java实现。它允许你连接到一个sshd 服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的 程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。 官网:http://www.jcraft.com/jsch/中有很多例子http://www.jcraft.com/jsch/examples/,这里先采用(已做修改)其中2... 如题,今天遇到个问题,使用JSCHjsch-0.1.54.jar实现的sftp在连接目标服务器时报com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stream Read异常,经查后发现是由于目标服务器的openssh升级至OpenSSH_7.4p1版本后导致的(可在服务器使用ssh -V命令查看openssh版本),原因如下:我使用的jdk是1.6的,jdk1.6支持的加密算法较少(jd 环境: jdk1.8、jsch-0.1.54.jar ssh登录日志报错:at com.jcraft.jsch.Session.connectcom.jcraft.jsch.JSchException: Session.conne... 网络流的结尾(end of stream)是什么? 在java.io包中大多数read方法的 javadoc 中,可以读到 the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached 大致意思是:读取到缓冲区的字节总数,或 -1,如果没有更多的数据,因为已经达到流的结尾 我们都知道 读取文件时,只要读取到 文件的     Java连接sftp,通过jsch jar包进行连接,目前java版本1.7会报如下错误: 2018-07-19 20:35:10,700 INFO SFTPUtils: Session created. com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidAlgorithmParam... 客户端ssh版本是6.6,服务端ssh版本是7.3。 sftp请求时报错ava.io.IOException: End of IO Stream Read。 后来查询得知是版本不一致导致,openSSH7.3默认屏蔽了jdk1.6支持的加密算法,如:diffie-hellman-group1-sha1等. 解决方案: 修改服务端ssh7.3中config配置,添加支持该算法的配置。 在/e... 测试环境sftp采用的jsch作为客户端来连接服务端进行文件传输,然后应用部署到生产后报错,算法协商失败 com.jcraft.jsch.JSchException: Algorithm negotiation fail Algorithm negotiation fail 算法协商失败 sftp和ssh用的是同一套加密算法,算法协商失败为客户端与服务端所支持的算法不一致,导致报该异常。解决方法为统一客户端及服务端所支持的算法。 检查客户端及服务端的版本 查看ssh版本: ssh - 异常错误信息 com.jcraft.jsch.JSchException: Algorithm negotiation fail at com.jcraft.jsch.Session.receive_kexinit(Session.java:595) at com.jcraft.jsch.Session.connect(Session.java:325) 出现这个问题主要是客户端与服务器的算法不一致导致的,只要将其中一边添加上对方的算法即可。 查看支持的算法 代码增加jsch的日志输出,根据 由于连接sftp所用jar最终会使用jsch的包。然而jsch的包会有各种版本问题。来梳理一下, 根源是jdk1.6支持的加密算法较少(jdk8支持了大多数加密算法),而openSSH8.0默认屏蔽了jdk1.6支持的加密算法,如:diffie-hellman-group1-sha1等。openSSH7的版本能支持1.6的算法。 首先查看主机ssh命令,执行ssh -v 在git clone 项目的时候, 竟然报错了:    no matching key exchange method found. Their offer: diffie-hellman-group1-sha1那么,想要解决此问题, 则需要在用户目录下的 .ssh文件夹下新建一个 config 文件,添加:  Host *  KexAlgorithms +diffie-hellman-group...        Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。通常我们需要多行代码才能完成的操作,借助于Stream流式处理可以很简单的实现。        Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的... 一个需求功能用到了SFTP文件上传的功能,使用的是之前封装好的工具类。 生产环境突然出现了问题,一直报错 com.jcraft.jsch.JSchException: Algorithm negotiation fail at com.jcraft.jsch.Session.receive_kexinit(Session.java:583) ~[jsch-0.1.51.jar:na] at com.jcraft.jsch.Session.connect(Session. 最新版本JSch.jar包支持的jdk1.8;不支持jdk1.6;   查看jdk版本:java -version   查看系统调用的jdk版本: ps  -ef|grep java 注:查看jdk版本及系统调用的版本有可能不一致,以系统调用jdk的版本为主; 2.关于openssl及openssh的说法:  我最终用的ope