解决JSCH的sftp连接时出现的com.jcraft.jsch.JSchException: Session.connect: java.io.IOException: End of IO Stre

问题描述
如题,今天遇到个问题,使用JSCH的jsch-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支持的加密算法较少(jdk8支持了大多数加密算法),而openSSH7.4默认屏蔽了jdk1.6支持的加密算法,如:diffie-hellman-group1-sha1等。一句话就是:jdk1.6支持的加密算法和openSSH7.4声明支撑的加密算法不一致导致的。

解决方案
方案一:升级jdk到1.8,openSSH配置文件不变(未亲测,但本文摘自的博客的博主亲测可用)

注意:

因为有的地方会说要在代码中指定diffie-hellman-group1-sha1算法(详见方案二),这里千万不要画蛇添足。

该方案从升级jdk入手,jdk8支持了大多数加密算法。该方案不需要修改任何配置文件。

 

方案二:保持jdk1.6,修改openSSH配置文件(未亲测,但本文摘自的博客的博主亲测可用)

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

      KexAlgorithms +diffie-hellman-group1-sha1

注意:

如果用的是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算法。

方案三:安装java安全插件,不用升级jdk不用修改openssh配置(亲测不可用,不知道为啥)

1、安装java安全插件:Java Cryptography Extension(JCE) Unlimited Strength Jurisdiction Policy Files。

      安装方法参考:https://blog.csdn.net/hfhwfw/article/details/68557238

      对应版本如下:

版本

对应插件名称

下载地址

jdk6

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 6

http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

jdk7

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 7

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

jdk8

Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files 8

http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
 

方案四: 引入bouncycastle加密包,不需升级jdk或更改openssh配置文件(亲测可用)

安装方法参考https://blog.csdn.net/cshichao/article/details/8732670

PS:bouncycastle最新版下载地址http://www.bouncycastle.org/latest_releases.html,在SIGNED JAR FILES处表格的Provider列找到对应jdk版本的jar包即可,下载bcprov-jdk15on-160.jar(160是版本号)。


原文链接:https://blog.csdn.net/Vertoria/article/details/82226340

根据提供的引用内容,你遇到的问题是`Caused by: com.jcraft.jsch.JSchException: Session.connect: java.net.SocketException: Connection reset`。这个错误通常是由于网络连接问题引起的。可能有以下几个原因导致这个错误: 1. 服务器端口未打开或被防火墙阻止:请确保你的SFTP服务器端口已正确打开,并且没有被防火墙阻止。 2. 服务器地址错误:请确保你的SFTP服务器地址是正确的,可以尝试使用ping命令来测试服务器的连通性。 3. 服务器连接:如果服务器连接,可能是由于网络延迟或服务器负载过高导致的。你可以尝试增加连接间或者优化服务器性能。 4. 客户端配置错误:请确保你的Java代码中的SFTP配置是正确的,包括服务器地址、端口、用户名、密码等。 以下是一个示例代码,演示了如何使用JSch库进行SFTP上传文件: ```java import com.jcraft.jsch.*; public class SftpExample { public static void main(String[] args) { String host = "sftp.example.com"; int port = 22; String username = "your-username"; String password = "your-password"; String localFilePath = "/path/to/local/file.txt"; String remoteFilePath = "/path/to/remote/file.txt"; try { JSch jsch = new JSch(); Session session = jsch.getSession(username, host, port); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); ChannelSftp channel = (ChannelSftp) session.openChannel("sftp"); channel.connect(); channel.put(localFilePath, remoteFilePath); channel.disconnect(); session.disconnect(); } catch (JSchException | SftpException e) { e.printStackTrace(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值