ganymed-ssh-2连接Cisco Confd报密钥交换未完成连接关闭问题咨询
问题根因
连接失败的核心原因是SSH握手阶段算法协商不匹配,堆栈中的根因报错已经给出明确指向:
Caused by: java.io.IOException: Cannot negotiate, proposals do not match.
错误发生在SSH连接建立的密钥交换(KEX)阶段,你使用的ganymed-ssh-2 v262组件和Cisco Confd节点各自支持的SSH算法集合没有共同交集,双方无法就连接参数达成一致,直接中断连接,外层就抛出了Key exchange was not finished, connection is closed的包装异常。JNC 1.0本身不实现SSH传输逻辑,完全依赖下层的ganymed-ssh-2完成SSH层连接,该报错和JNC组件本身无关。
常见触发场景
- ganymed-ssh-2 v262是2014年前后发布的老旧版本,默认仅支持早期的弱加密算法,包括基于SHA1的密钥交换算法(如
diffie-hellman-group1-sha1、diffie-hellman-group-exchange-sha1)、弱对称加密算法、弱MAC校验算法。当前主流版本的Cisco Confd默认会禁用上述存在安全风险的弱算法,仅开放高安全等级的算法(如curve25519-sha256、diffie-hellman-group14-sha256、ecdh-sha2-nistp256、aes256-gcm@openssh.com等),双方算法集无重叠直接协商失败。 - 若运行环境使用JDK 17及以上的高版本,高版本JDK默认禁用了所有基于SHA1的弱加密算法,即使ganymed-ssh-2声明支持旧算法,调用JDK加密组件时也无法启用,此时如果对接的是仅开放弱算法的老旧版本Cisco Confd节点,同样会触发协商不匹配。
- 除密钥交换算法外,双方支持的主机密钥算法、对称加密算法、消息校验MAC算法任意一类无共同支持项,都会抛出该类协商失败错误。
排查方式
开启ganymed-ssh-2的debug日志,打印客户端发起连接时声明支持的全量算法列表,同时登录Cisco Confd节点查看SSH服务端配置的允许算法列表,对比两份清单即可确认缺失的匹配项。
内容的提问来源于stack exchange,提问作者Mohan
相关产品推荐
相关产品推荐

