1. 问题现象
执行 SSH 连接命令时出现如下报错:
bash
$ ssh <USERNAME>@<HOST_IP>
Unable to negotiate with <HOST_IP> port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss
2. 问题原因
- 目标服务器(
<HOST_IP>)仅支持ssh-rsa和ssh-dss这两种较旧的主机密钥签名算法。 - 客户端(Mac 上的 OpenSSH)出于安全考虑,已默认禁用或降低了这些算法的优先级,导致无法协商成功。
3. 解决方案
3.1 临时解决(单次连接)
在 ssh 命令中临时允许使用 ssh-rsa 算法:
bash
ssh -o HostKeyAlgorithms=+ssh-rsa <USERNAME>@<HOST_IP>
如果仍报公钥算法错误,可同时添加公钥算法选项:
bash
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa <USERNAME>@<HOST_IP>
注:旧版 OpenSSH 中
PubkeyAcceptedAlgorithms可能写作PubkeyAcceptedKeyTypes,请根据客户端版本调整。
3.2 永久解决(修改配置)
编辑(或创建)用户目录下的 SSH 配置文件 ~/.ssh/config,为指定服务器添加如下配置:
markdown
Host <HOST_IP>
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
保存后,直接使用 ssh <USERNAME>@<HOST_IP> 即可自动应用配置。
4. 安全说明
ssh-rsa和ssh-dss均基于 SHA-1 哈希算法,存在已知的安全弱点(如碰撞攻击风险)。- 长期解决方案建议升级服务器端的 SSH 服务,使其支持更安全的算法(如
rsa-sha2-256、rsa-sha2-512或ed25519)。 - 如果服务器无法升级,以上配置可作为临时或受控环境下的兼容措施。