升级 OpenSSH 到 8.8 版本后出现 RSA 密钥拒绝连接,最稳妥的处理方式是生成新的 Ed25519 密钥对替换旧的 RSA 密钥,临时应急则需要在客户端或服务端配置中显式启用 ssh-rsa 算法。
先说结论:这是 OpenSSH 安全策略变更导致的兼容性问题,建议优先更换密钥算法而非强行开启旧算法。
- 先确认:检查 SSH 版本及报错详情
- 先处理:生成新密钥或修改算法配置
- 再验证:通过 verbose 模式确认握手成功
命令速用版
如果你需要立刻恢复连接,可以在客户端命令中临时指定算法,或者生成新密钥。
# 生成新的 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 临时使用旧 RSA 算法连接(仅应急)
ssh -o HostkeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa user@host为什么会这样
OpenSSH 在 8.8 版本中默认禁用了 ssh-rsa 公钥签名算法。这并不是禁止使用 RSA 密钥文件本身,而是不再信任使用 SHA-1 哈希算法进行的签名操作。由于 SHA-1 已被证明存在碰撞风险,社区决定逐步淘汰该算法。如果你的客户端或服务端升级到了 8.8 或更高版本,而另一方仍尝试使用旧的 ssh-rsa 签名方式,握手就会失败,表现为权限拒绝。
分步处理
根据你是否能接受更换密钥,分为两种处理路径。
方案一:更换为更安全的密钥(推荐)
- 在本地生成新密钥:
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 - 将公钥上传到服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host - 如果无法自动上传,手动将
id_ed25519.pub内容追加到服务器的~/.ssh/authorized_keys文件中。 - 测试连接:
ssh -i ~/.ssh/id_ed25519 user@host
方案二:临时兼容旧算法(仅限内网或过渡期)
- 编辑客户端配置文件
~/.ssh/config,添加: - 或者编辑服务端的
/etc/ssh/sshd_config,添加: - 重启服务端 SSH 服务:
sudo systemctl restart sshd
Host *
PubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsaPubkeyAcceptedAlgorithms +ssh-rsa
HostkeyAlgorithms +ssh-rsa怎么验证是否生效
使用详细模式连接,观察握手过程中的算法协商信息。
ssh -v user@host在输出日志中,查找 Offering public key 或 Server accepts key 相关行。如果看到 ssh-ed25519 或 rsa-sha2-... 且最终显示 Authentication succeeded,说明配置生效。如果依然看到 Permission denied (publickey) 且日志提示算法不匹配,则需检查配置文件是否加载正确。
常见坑
- 不要把自己锁在外面:修改服务端配置前,务必保持当前会话不断开,新开一个终端测试成功后再关闭旧会话。
- 配置文件权限:SSH 对配置文件和密钥文件权限非常敏感,
~/.ssh目录应为 700,密钥文件应为 600,否则可能报错。 - 客户端与服务端区别:有时候是客户端升级了,有时候是服务端升级了,两边都需要检查是否支持对应的算法。
- RSA 密钥并非完全不可用:8.8 版本禁用的是 ssh-rsa 签名算法,使用 rsa-sha2-256 或 rsa-sha2-512 签名的 RSA 密钥仍然可以使用,但生成新密钥类型更省心。
参考来源
- OpenSSH, OpenSSH 8.8 Release Notes, https://www.openssh.com/releasenotes.html