OpenSSH 8.8 以后版本跟老版的兼容性问题

缘起

最近发现 ssh 到自己的路由器,发现连不上,报错:

Unable to negotiate with 10.0.0.1 port 22: no matching host key type found. Their offer: ssh-rsa

NOTE: 上面的 “10.0.0.1” 是服务器的 IP 地址

原因

网上查了下,发现是 OpenSSH 新版本的锅。OpenSSH 8.8 开始,缺省不再支持使用 SHA-1 hash 算法的 RSA 签名。

其实这个变动对稍稍新一点的 OpenSSH 服务器(据说 7.2 及以后版本)没有问题,因为其除了 SHA-1 外,还支持 SHA-256、SHA-512 等更强壮的算法。ssh-rsa 的密钥会自动使用更强壮的 hash 算法了。

但是对一些较老的 OpenSSH 服务器(7.2 以前版本),则就有问题了,因为其对 ssh-rsa 只支持 SHA-1 一种 hash 算法。但此时客户端又不支持这种算法,故而连接会失败。系统上面的错误。

解决方法

ssh 连接有问题的服务器时,加上两个参数即可。如:

1
2
3
4
5
ssh \
-oHostKeyAlgorithms=+ssh-rsa \
-oPubKeyAcceptedAlgorithms=+ssh-rsa \
10.0.0.1
# 假设 ssh 服务器 IP 地址是 10.0.0.1

todo list

  • 更新自己的密钥对,使用ssh-keygen -o -a 100 -t ed25519 -f ~/.ssh/pk4ym_ed25519 -C "[email protected]"
  • 把新的公钥部署到服务器上去,包括 github

附件