ssh 处理连接异常 no matching host key type found
通过ssh连接服务器失败
$ ssh root@172.16.0.247
Unable to negotiate with 172.16.0.247 port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dssSSH 客户端和远程服务器无法协商使用相同的 host key 类型。
解决方法:
添加参数
# -oHostKeyAlgorithms=+ssh-rsa 允许接收远程主机提供的 ssh-rsa 类型的 主机密钥(连接握手阶段)
# -oPubkeyAcceptedAlgorithms=+ssh-rsa 允许使用 ssh-rsa 类型的 用户身份验证公钥(登录认证阶段)
ssh root@172.16.0.247 -oHostKeyAlgorithms=+ssh-rsa -oPubkeyAcceptedAlgorithms=+ssh-rsa原因
SSH 客户端和远程服务器无法协商使用相同的 host key 类型。根本原因是:
客户端禁用了服务器所提供的密钥算法(如 ssh-rsa, ssh-dss)
现代 OpenSSH 客户端(尤其是版本 8.8+)默认禁用了不安全或过时的密钥类型,如:
ssh-rsa(因依赖 SHA-1,已被弃用)ssh-dss(更早期,已被彻底禁用)
而你的服务器只支持这些算法,因此协商失败。
查看 OpenSSH 发行说明
OpenSSH 8.8/8.8p1 (2021-09-26)
可能不兼容的更改
=============
此版本默认禁用使用 SHA-1 哈希算法的 RSA 签名。
之所以做出这一更改,是因为 SHA-1 哈希算法在密码学上存在缺陷,有可能产生 <USD$50K [1] 的选择前缀哈希碰撞。
对于大多数用户来说,这一变更应该是不可见的,也无需更换 ssh-rsa 密钥。
OpenSSH 从 7.2 版开始支持 RFC8332 RSA/SHA-256/512 签名,现有的 ssh-rsa 密钥将尽可能自动使用更强的算法。
当连接到未升级或未密切跟踪 SSH 协议改进的旧版 SSH 实现时,更有可能出现不兼容问题。
在这种情况下,可能需要有选择地重新启用 RSA/SHA1,以便通过 HostkeyAlgorithms 和 PubkeyAcceptedAlgorithms 选项进行连接和/或用户身份验证。
例如,~/.ssh/config 中的以下一节将启用 RSA/SHA1,以便对单个目标主机进行主机和用户身份验证:
Host old-host
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
我们建议启用 RSA/SHA1 仅作为一种权宜之计,直到传统实施可以升级或重新配置其他密钥类型(如 ECDSA 或 Ed25519)。解决方法:
1.命令行添加参数
| 参数 | 用途 |
|---|---|
HostKeyAlgorithms=+ssh-rsa | 允许接收远程主机提供的 ssh-rsa 类型的 主机密钥(连接握手阶段) |
PubkeyAcceptedKeyTypes=+ssh-rsa或者 PubkeyAcceptedAlgorithms=+ssh-rsa | 允许使用 ssh-rsa 类型的 用户身份验证公钥(登录认证阶段) |
查看 OpenSSH发行说明 在 OpenSSH 8.5/8.5p1 (2021-03-03) 版本,将 PubkeyAcceptedKeyTypes修改为了PubkeyAcceptedAlgorithms
Bugfixes
--------
* ssh(1), sshd(8):将 PubkeyAcceptedKeyTypes 关键字更名为 PubkeyAcceptedAlgorithms。
之前的名称错误地暗示它控制允许的密钥算法,而实际上该选项指定了可接受的签名算法。
之前的名称仍可作为别名使用。 bz#3253验证通过
# 添加 -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa 参数,允许rsa
$ ssh root@172.16.0.247 -oPubkeyAcceptedKeyTypes=+ssh-rsa -oHostKeyAlgorithms=+ssh-rsa
The authenticity of host '172.16.0.247 (172.16.0.247)' can't be established.
RSA key fingerprint is SHA256:RLzH8NJknLbzgau/1NOVgCi//nyeeH4ilk89UjMBdlQ.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.16.0.247' (RSA) to the list of known hosts.
root@172.16.0.247's password:
2.~/.ssh/config 添加参数
Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
# OpenSSH 8.5 版本将 PubkeyAcceptedKeyTypes 关键字更名为 PubkeyAcceptedAlgorithms。
# 因为之前的名称存在歧义,不是密钥算法,而是签名算法。
# PubkeyAcceptedKeyTypes +ssh-rsa