java 为什么使用ganymed-ssh-2对服务器进行编程SSH会导致密钥交换错误?

gdrx4gfi  于 2023-03-21  发布在  Java
关注(0)|答案(3)|浏览(796)

我正在使用ganymed-ssh-2 Java库创建从一个AWS EC2到另一个AWS EC2(在同一个VPC中)的连接,并且'connect()'命令给出以下错误:

java.io.IOException: Key exchange was not finished, connection is closed.
    at ch.ethz.ssh2.transport.KexManager.getOrWaitForConnectionInfo(KexManager.java:75)
    at ch.ethz.ssh2.transport.TransportManager.getConnectionInfo(TransportManager.java:169)
    at ch.ethz.ssh2.Connection.connect(Connection.java:759)
    at ch.ethz.ssh2.Connection.connect(Connection.java:628)
    at bravura.autoperf.executor.SSHExecutor.connectTo(SSHExecutor.java:156)
    at bravura.autoperf.executor.SSHExecutor.runRemoteSSHCommand(SSHExecutor.java:57)
    at bravura.autoperf.executor.SSHExecutor.runRemoteSSHCommand(SSHExecutor.java:141)
    at bravura.autoperf.util.Utilities.runCommandRepeatedly(Utilities.java:614)
    at bravura.autoperf.test.Server.getServerDetails(Server.java:233)
    at bravura.autoperf.test.Server.<init>(Server.java:127)
    at bravura.autoperf.test.Server.<init>(Server.java:65)
    at bravura.autoperf.util.Utilities.getClientServer(Utilities.java:499)
    at bravura.autoperf.manager.RunSetupManager.<init>(RunSetupManager.java:69)
    at bravura.autoperf.manager.ExecutionManager.runTests(ExecutionManager.java:171)
    at bravura.autoperf.manager.ExecutionManager.main(ExecutionManager.java:64)
Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
    at ch.ethz.ssh2.transport.ClientKexManager.handleMessage(ClientKexManager.java:123)
    at ch.ethz.ssh2.transport.TransportManager.receiveLoop(TransportManager.java:572)
    at ch.ethz.ssh2.transport.TransportManager$1.run(TransportManager.java:261)
    at java.lang.Thread.run(Thread.java:748)

调用代码:

Connection connection = new Connection(host);
    connection.connect();

这是在有机会调用“authenticateWithPublicKey()”方法之前。
已为VPC CIDR范围(两个示例均在该范围内)的22端口流量开放NACL和相关安全组。路由表将所有VPC CIDR流量路由到本地。
我可以手动SSH没有问题。
(OS是Amazon Linux 2 fwiw)
谢谢你的帮助。

hi3rlvi2

hi3rlvi21#

阅读异常输出,它将表明服务器上支持的密钥交换算法之一与客户端支持的任何密钥交换算法都不匹配。
原因:java.io. IO异常:无法协商,建议书不匹配。
通过执行命令行,您可以很容易地看到服务器支持什么
ssh -vv user@host
最可能的原因是密码、HMAC或密钥交换算法。我会猜测密钥交换,因为这些年来这些算法有很多变化,因此在发现Logjam等漏洞后,现代服务器可能会配置为更强的密钥交换
要真正解决这个问题,需要在客户端库中升级到支持所缺少的算法的东西。

ocebsuys

ocebsuys2#

如果您的设置是在一个安全的受控环境中,并且您想避免这个错误,那么请在/etc/ssh/sshd_config中的2个条目后面添加注解

PermitEmptyPasswords no
MACs <some entry>

并重新启动sshd(service sshd restart)这应该可以工作

blpfk2vs

blpfk2vs3#

我在使用ganymed-ssh 2时遇到了同样的问题,错误发生在Ubuntu 20上,ganymed-ssh 2库使用diffie-hellman-group-exchange-sha1,diffie-hellman-group 14-sha1,diffie-hellman-group 1-sha1 Kex Algos,Ubuntu默认启用了这些算法:
curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha256
正如这里提到的https://manpages.ubuntu.com/manpages/impish/en/man5/sshd_config.5.html,我使用sshd_config启用了diffie-hellman-group14-sha1,并添加了一行KexAlgorithm +diffie-hellman-group14-sha1

相关问题