报错是这么冒出来的。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 放回来,只对跳板机这类内网老客户端开;根治办法是升级客户端,不是长期放宽服务端。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189