报错是这么冒出来的。CentOS 7 上把 OpenSSH 从 7.4 编译升级到 9.3,一台老跳板机 ssh 登录报 Unable to negotiate with 10.0.0.11 port 22: no matching host key type found. Their offer: ssh-rsa。
真正麻烦的地方在于,几个原因的现象几乎一样。OpenSSH 8.8 起默认禁用 ssh-rsa 这类 SHA-1 签名算法。也可能是老客户端只支持 ssh-rsa,不认 rsa-sha2-256 与 rsa-sha2-512。
少数情况下是服务端没在 sshd_config 里为老客户端开兼容项。
先抓握手阶段的算法协商
ssh -vvv ops@10.0.0.11 2>&1 | grep -i 'host key'
服务端放开指定算法
在 sshd_config 写 HostKeyAlgorithms +ssh-rsa
客户端侧临时指明算法
ssh -o HostKeyAlgorithms=+ssh-rsa ops@10.0.0.11
校验并重载 sshd
sshd -t && systemctl reload sshd
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
别只看报错消失,验证要多做一步。老客户端能完成握手(-vvv 里出现 Server host key: ssh-rsa),新客户端仍走 rsa-sha2-512,sshd 日志里不再有 no matching 记录。
为兼容开 +ssh-rsa 等于把 SHA-1 放回来,只对跳板机这类内网老客户端开;根治办法是升级客户端,不是长期放宽服务端。这类问题最好一次改到位,反复小改反而容易把原因搅混。
