国产服务器引发的痛java.io.IOException: Key exchange was not finished, connection is closed.Cannot negotiate

国产服务器引发的痛java.io.IOException: Key exchange was not finished, connection is closed.Cannot negotiate

ssh升级完报错:

java.io.IOException: Key exchange was not finished, connection is closed.Cannot negotiate, proposa

原因

是ssh中的key交换算法不兼容导致

解决方式一

vi /etc/ssh/sshd_config
#最后一行
 
KexAlgorithms diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group1-sha1,curve25519-sha256@libssh.org
 
HostKeyAlgorithms ssh-dss,ssh-rsa
 
 
#重启ssh服务
service sshd restart

解决方式二

由于甲方不让改服务器配置只能寻求他法,最终只能从代码层面入手。原有的一些密钥算法已经不再支持,我们目前使用的Jcraft公司发布的Jsch版本已经没办法满足,需要进行升级。但是Jcraft公司的Jsch0.1.55版本从2018年开始就停止维护,我们不得不升级到另一个mwiede继续维护的Jsch版本(基于原有0.1.55fork的分支)以满足更多算法的需要。

  1. 依赖修改后
<dependency>
  <groupId>com.github.mwiede</groupId>
  <artifactId>jsch</artifactId>
  <version>0.2.16</version>
</dependency>

RSA/SHA1 签名算法在新版本Jsch中由于安全原因已经被默认关闭,由于有些上下游仍然使用旧版本的OpenSSH服务,因为没办法新版Jsch没办法连接,从以上报错信息可以看到,对方服务器需要ssh-rsa,ssh-dss,因此我们需要在创建连接前对SFTP Session额外添加以下配置:

session.setConfig("server_host_key", session.getConfig("server_host_key") + ",ssh-rsa");
session.setConfig("PubkeyAcceptedAlgorithms", session.getConfig("PubkeyAcceptedAlgorithms") + ",ssh-rsa,rsa-sha2-256")

  • com.jcraft.jsch.JSchProxyException: ProxySOCKS5: stream is closed" - 同上,由于我们代理服务器也是使用的是旧版OpenSSH,因此加入上面配置即可。
  • com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidAlgorithmParameterException: DH key size must be multiple of 64, and can only range from 1024 to 2048 (inclusive). The specific key size 3047 is not supported. - 这是由于当前JDK版本不支持更高位数的Diffie-Hellman密钥交换算法的密钥长度,这里我们可以通过以下参数指定推荐的密钥长度
session.setConfig("dhgex_min", "1024")
session.setConfig("dhgex_max", "2048")
session.setConfig("dhgex_preferred", "2048")

完整代码如下

  // 设置JSch
           JSch jsch = new JSch();
           Session session = jsch.getSession(user, host, PORT);
           session.setPassword(passwd);

           // 设置配置信息
           java.util.Properties config = new java.util.Properties();
           config.put("StrictHostKeyChecking", "no");
           session.setConfig(config);
           session.setConfig("server_host_key", session.getConfig("server_host_key") + ",ssh-rsa,ssh-dss");
           session.setConfig("PubkeyAcceptedAlgorithms", session.getConfig("PubkeyAcceptedAlgorithms") + ",ssh-rsa,,ssh-dss,rsa-sha2-256");
           session.setConfig("dhgex_min", "1024");
           session.setConfig("dhgex_max", "2048");
           session.setConfig("dhgex_preferred", "2048");
           // 连接到服务器
           session.connect();
             // 进行后续操作
            System.out.println("连接成功");
            // 断开连接
            session.disconnect();
ftpclient 是一个 Java 的 FTP 客户端类,用于在 Java 程序中连接和操作 FTP 服务器。然而,在执行某些操作时,可能会遇到 "ftpclient caused by: java.io.ioexception: connection is not open" 的异常。 这个异常的原因是因为在执行 FTP 操作之前,没有正确地打开 FTP 连接。在使用 FTPClient 进行 FTP 操作之前,我们需要先使用 connect() 方法连接到 FTP 服务器,并使用正确的主机名、用户名和密码。 连接到 FTP 服务器后,我们可以使用 login() 方法进行登录验证。如果没有成功登录,那么可能是用户名或密码错误,需要确保提供的用户名和密码是正确的。 另外,还需要注意在执行完所有的 FTP 操作后,使用 disconnect() 方法关闭连接,以释放资源和保持良好的编程习惯。 在处理这个异常时,可按照以下步骤进行排查: 1. 确保使用 connect() 方法正确连接到 FTP 服务器。 2. 确保使用 login() 方法成功登录到 FTP 服务器。 3. 检查是否在执行 FTP 操作之前使用了已关闭的连接。 4. 确保在所有操作完成后,使用 disconnect() 方法关闭连接。 总结:连接未打开的 "ftpclient caused by: java.io.ioexception: connection is not open" 异常通常是由于未正确连接到 FTP 服务器或未正确打开连接导致的。按照正确的连接和操作顺序,确保正确打开连接并在使用完之后关闭连接,可以避免这个异常的出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值