通过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-dss

SSH 客户端和远程服务器无法协商使用相同的 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

标签: OpenSSH, 问题记录

添加新评论