Linux重新生成SSH主机密钥需以root权限执行:先备份并删除/etc/ssh/下原有ssh_host_*_key文件,再运行sudo ssh-keygen -A生成新密钥对,最后重启sshd服务并验证指纹。

Linux 重新生成 SSH 主机密钥(即服务器端的 host key),本质上是替换 /etc/ssh/ 目录下由 sshd 使用的那组密钥文件(如 ssh_host_rsa_key、ssh_host_ecdsa_key、ssh_host_ed25519_key 等),从而改变其公钥指纹。这常用于解决密钥变更警告(如 “WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!”)、安全轮换或重装系统后清理旧指纹。
? 为什么需要重新生成主机密钥?
- 防止中间人攻击(旧密钥泄露后)
- 虚拟机克隆或镜像复用导致多台机器共用同一组主机密钥
- 审计或合规要求定期轮换
- 解决客户端因指纹不匹配而拒绝连接的问题
?️ 正确操作步骤(以 root 权限执行)
1. 备份原有主机密钥(可选但推荐)
sudo mkdir -p /etc/ssh/hostkeys-backup-$(date +%F) sudo cp /etc/ssh/ssh_host_*_key* /etc/ssh/hostkeys-backup-$(date +%F)/ 2>/dev/null
2. 删除现有主机密钥文件
⚠️ 注意:只删密钥文件,不要删 sshd_config 或其他配置
sudo rm /etc/ssh/ssh_host_*_key*
3. 重新生成全套主机密钥
现代 OpenSSH 默认会生成 RSA、ECDSA 和 ED25519 三种(推荐保留全部):
sudo ssh-keygen -A
✅ 这条命令会自动检测缺失的密钥类型,并在 /etc/ssh/ 下生成标准命名的密钥对(含私钥 + 公钥 .pub),权限也自动设为正确值(私钥 600,公钥 644)。
? 补充说明:
-A是“生成所有缺失的 host keys”的快捷方式;- 若只想生成某一种(比如仅 ED25519):
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
4. 重启 SSH 服务使新密钥生效
# systemd 系统(主流发行版如 Ubuntu 20.04+/CentOS 7+) sudo systemctl restart sshd # 或旧式 SysV init(如 CentOS 6) sudo service sshd restart
5. 验证新指纹是否已更新
在服务器上查看当前主机公钥指纹:
sudo ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key sudo ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key
输出类似:
256 SHA256:AbCdEf... user@host (ED25519) 3072 SHA256:XyZ123... user@host (RSA)
客户端下次连接时,会提示“新的主机密钥”,需确认接受(或手动更新 ~/.ssh/known_hosts 中对应行)。
⚠️ 注意事项
- 不要手动复制或重用其他机器的
/etc/ssh/ssh_host_*_key—— 每台主机必须有唯一密钥; -
ssh-keygen -A不会覆盖已有密钥,只生成缺失的;因此先rm再运行更稳妥; - 确保
/etc/ssh/下密钥文件属主为root:root,权限严格(私钥不可被 group/o 读); - 如果使用 SELinux(如 RHEL/CentOS),重建密钥后建议运行
sudo restorecon -Rv /etc/ssh恢复上下文。
? 小技巧:批量清理并刷新客户端 known_hosts
若已知服务器 IP 是 192.168.1.100,可在客户端执行:
ssh-keygen -R 192.168.1.100
这样下次 ssh user@192.168.1.100 就会提示接受新指纹,避免报错中断。
不复杂但容易忽略。


















