java.io.IOException: Key exchange was not finished, connection is closed.
at ch.ethz.ssh2.transport.KexManager.getOrWaitForConnectionInfo(KexManager.java:75) ~[ganymed-ssh2-262.jar!/:262]
at ch.ethz.ssh2.transport.TransportManager.getConnectionInfo(TransportManager.java:169) ~[ganymed-ssh2-262.jar!/:262]
at ch.ethz.ssh2.Connection.connect(Connection.java:759) ~[ganymed-ssh2-262.jar!/:262]
at ch.ethz.ssh2.Connection.connect(Connection.java:628) ~[ganymed-ssh2-262.jar!/:262]
ganymed-ssh2版本
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
在使用ganymed-ssh2连接服务器执行ssh命令时部署在本地是可以用的,但是部署在正式环境后出现了如上的报错,网上有一些解决方案
我最后使用了在连接服务器的/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
然后重启ssh服务 /etc/init.d/ssh restart 得到解决
问题是解决了但是不知道问题原因还是觉得想悬在头上的一把剑,以后在别的环境部署也要这样做,如果不允许你修改怎么办?
于是在github上看了代码的最新更新时间,竟然是在11年前,真的是太老了
GitHub - northern-bites/ganymed-ssh2: Ganymed Java SSH2 Protocol
最后查看了出异常的ssh版本
# ssh -V
OpenSSH_8.4p1 Debian-5, OpenSSL 1.1.1k 25 Mar 2021
正常连接的服务器ssh版本为
# ssh -V
OpenSSH_7.9p1 Debian-10+deb10u2, OpenSSL 1.1.1d 10 Sep 2019
两个环境的版本有区别
通过调试代码发现8.4版本的openssh支持的KexAlgorithms算法为一下几种
curve25519-sha256
diffie-hellman-group14-sha256
diffie-hellman-group18-sha512
diffie-hellman-group16-sha512
diffie-hellman-group-exchange-sha256
ecdh-sha2-nistp521
ecdh-sha2-nistp384
ecdh-sha2-nistp256
curve25519-sha256@libssh.org
而ganymed-ssh2代码ch.ethz.ssh2.transport.KexManager中只支持了三种算法
public static final String[] getDefaultClientKexAlgorithmList()
{
return new String[] { "diffie-hellman-group-exchange-sha1", "diffie-hellman-
group14-sha1","diffie-hellman-group1-sha1" };
}
上面三种算法在8.4版本的ssh中已经被淘汰,导致ganymed-ssh2无法在高版本的openssh中连接到服务器,至此原因找到
通过以上分析果断弃用ganymed-ssh2,经过调研发现jsch使用的算法可以满足项目需要,并进行了集成
集成也相对简单,项目中引用相关依赖即可
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
官网也有很多集成案例可以上去参考