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>

官网也有很多集成案例可以上去参考

 JSch - Examples

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐