最有效方式是修改 /etc/ssh/sshd_config 禁用 ssh-rsa 并显式配置 PubkeyAcceptedAlgorithms 和 HostKeyAlgorithms,启用 rsa-sha2-512、ecdsa-sha2-nistp256、ssh-ed25519 等安全算法,同步更新客户端密钥类型并重启 sshd 服务验证。

直接在服务端 /etc/ssh/sshd_config 中禁用 ssh-rsa 是最有效的方式,但必须同步启用更安全的替代算法,并确保客户端兼容。这不是单纯删掉一个名字,而是整体签名体系的升级。
确认当前服务器支持的签名算法
先查清楚你的 OpenSSH 版本和它允许的主机密钥签名类型:
- 运行
ssh -Q key-signature(客户端)或sshd -T | grep pubkeyacceptedalgorithms(服务端)查看默认列表 - 典型现代输出会包含:
rsa-sha2-512、rsa-sha2-256、ecdsa-sha2-nistp256、ssh-ed25519等;ssh-rsa(即 SHA-1 签名的 RSA)通常仍默认存在,需主动剔除
修改sshd_config强制剔除ssh-rsa并显式声明安全算法
编辑配置文件:
- 打开
/etc/ssh/sshd_config - 添加或修改这一行(注意是 PubkeyAcceptedAlgorithms,不是 PubkeyAuthentication):
PubkeyAcceptedAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,rsa-sha2-512,rsa-sha2-256 - 确保该行未被注释,且不包含
ssh-rsa或ssh-dss - 同时检查
HostKeyAlgorithms是否也排除了ssh-rsa(例如:HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256,rsa-sha2-512)
配套操作:确保密钥与服务端能力对齐
只改配置不够,还需验证实际使用的密钥类型是否落在新白名单内:
- 如果你的用户公钥是旧式
ssh-rsa AAAAB3...开头(SHA-1 签名),它将被拒绝——必须更换为ssh-ed25519或ecdsa-sha2-nistp256类型密钥 - 生成新密钥:
ssh-keygen -t ed25519 -C "admin@prod",然后用ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host部署 - 若必须保留 RSA 密钥,请确保它是用
ssh-keygen -t rsa -b 4096生成,并在客户端连接时显式指定签名算法:ssh -o HostKeyAlgorithms=rsa-sha2-512 -o PubkeyAcceptedAlgorithms=rsa-sha2-512 user@host
重启服务并验证生效
保存配置后务必重启 SSH 服务,并测试连接是否仍可用:
sudo systemctl restart sshd- 从另一台机器尝试登录,同时加
-vvv参数观察协商过程:ssh -vvv user@host 2>&1 | grep -i "signature\|algorithm" - 成功时应看到类似
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519></ssh-ed25519>,且不含ssh-rsa


















