SecureCRT连接CentOS提示Key exchange failed解决:一次排障实录
SecureCRT连接CentOS提示Key exchange failed解决

刚泡好的咖啡还没凉,SecureCRT就弹出一行红字:Key exchange failed。远程CentOS主机明明开着,端口也通,凭据也没改,偏偏卡在密钥交换这一步。很多人第一反应是重启,结果重启完还是一样。别急,下面把踩坑过程原封不动搬出来,照着做,十分钟内就能重新看到熟悉的命令行。
先确认是不是服务端“挑食”
SSH协议版本升级后,CentOS默认把弱算法全部踢出局。如果SecureCRT还在用老配置,两边算法对不上,立刻报Key exchange failed。登到机房本地终端,打开/etc/ssh/sshd_config,搜KexAlgorithms这一行,若看到diffie-hellman-group14-sha256、ecdh-sha2-nistp256之类,说明服务器只认高强度算法。再瞄一眼Ciphers和MACs,如果列出的都是aes256-gcm@openssh.com、umac-128-etm@openssh.com这类,老版本SecureCRT根本凑不齐“对暗号”的筹码。
给SecureCRT打补丁不如改配置
很多人跑去下新版SecureCRT,其实9.0之前只要手动开算法就能活。菜单栏依次点:Options → Global Options → General → Configuration Paths,记住路径,关闭软件。用记事本打开SecureCRT.ini,搜索"Key Exchange"字段,把缺省的diffie-hellman-group1改成:
KexAlgorithms=diffie-hellman-group14-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521
ciphers=aes256-ctr,aes192-ctr,aes128-ctr,aes256-gcm@openssh.com
MACs=hmac-sha2-256,hmac-sha2-512,umac-128-etm@openssh.com
保存后再开SecureCRT,别急着连,先右键会话 → Properties → SSH2 → Advanced,把“Enable none cipher”勾掉,再把“Enable compression”也关掉,减少变量。
服务器端放宽算法只改一行

如果客户端一时升不了级,也可以让CentOS“松口”。在/etc/ssh/sshd_config末尾加:
KexAlgorithms +diffie-hellman-group14-sha1
Ciphers +aes128-ctr
MACs +hmac-sha1
保存后执行systemctl reload sshd,不断现有会话,新连接就能用旧算法过渡。注意,这只是临时方案,生产环境还是尽快把客户端算法补齐,别让弱加密留在内网。
密钥长度与证书链也别忽视
有些单位把RSA主机密钥升到4096位,SecureCRT老版本在握手阶段读到超长证书直接甩手不干,同样报Key exchange failed。此时要么升级客户端,要么在服务器端再生成一副2048位的临时密钥:
cd /etc/ssh
ssh-keygen -t rsa -b 2048 -f sshhostrsa_key.tmp
mv sshhostrsakey.tmp sshhostrsakey
mv sshhostrsakey.tmp.pub sshhostrsakey.pub
systemctl restart sshd
重启后旧客户端就能握手。等新客户端部署完,再把密钥换回去即可。
防火墙与中间设备偷改包
算法都对,仍然Key exchange failed,就要怀疑网络里有没有“老六”。某些WAF或IPS见到SSH握手里的ECDH就误报攻击,直接丢包。把客户端IP加入白名单,或者临时把SSH端口换到高位,绕过监控,再测试。能连上,就说明问题不在系统,而在网络策略。
一次排障 checklist
1. 本地telnet IP 22,看TCP通不通。
服务端ss -tulnp | grep 22确认监听。
ssh -vvv user@ip从另一台Linux试连,看停在哪一步。
对照sshd_config的算法列表,把缺的加到SecureCRT.ini。
改完配置重启SecureCRT,不要只断开会话,必须完全退出重进。
如果仍失败,抓包:tcpdump -i any port 22 -w ssh.pcap,用Wireshark过滤ssh.message_code==20,看是哪边先Reset。
常见坑点一句话总结
只升级服务端不升级客户端,算法对不上,必弹Key exchange failed;只升级客户端不检查服务端,白忙活;改配置不重启SecureCRT,新算法不生效;复制粘贴算法时多一个空格,整行失效;把sshd_config改错,sshd -t校验不过,服务直接起不来。
按上面顺序一路敲完,咖啡刚好喝完,SecureCRT里已经出现[user@centos ~]$提示符。下次再遇到Key exchange failed,五分钟就能定位,不用再到处翻旧帖。

