OpenSSH clientSSH
错误信息
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
也可能输出为
- IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
- Offending ED25519 key in /root/.ssh/known_hosts:1
以一段被 `@` 字符行包围的文字块输出,后面依次是新密钥的指纹、有问题的 known_hosts 行,以及“Host key verification failed.”。
OpenSSH client — host key differs from the one recorded in known_hosts
含义
服务器出示的主机密钥与 `known_hosts` 中为这个主机名或地址记录的不同。ssh 无法区分合法的变更(重装、同一 IP 后面换了新机器)和有人拦截连接,因此在批处理模式下拒绝继续,在其他情况下则禁用密码和键盘交互式身份验证。“Offending … key in …:N”这一行告诉你 known_hosts 的哪一行保存着旧密钥。
原因
服务器被重建了
常见重装系统、基于镜像的重新部署,或者在启动时生成主机密钥的容器,都会在同一个名称下产生新的主机密钥。
该地址现在属于另一台机器
常见云 IP 地址和 DHCP 租约会被回收再分配。按 IP 记录的条目保存的仍是旧机器的密钥。
同一个名称后面有多台密钥不同的主机
偶见如果轮询 DNS 或 TCP 负载均衡器后面的服务器不共享主机密钥,这个警告就会随机出现。
有人在中间拦截
罕见这种情况很少见,但正是这项检查要防范的:被攻陷的网络、恶意 Wi-Fi 或被劫持的 DNS 用自己的密钥应答。接受之前先验证。
修复方法
- 1.
先验证新密钥,再替换条目
把新指纹与可信来源提供的指纹比对;确认之后,再用 `ssh-keygen -R` 删除旧的行(按名称和按 IP 各删一次)。
bash # 1. Get the new fingerprint from a trusted channel (cloud console, provisioning logs, the admin) ssh-keyscan -t ed25519 server.example.com 2>/dev/null | ssh-keygen -lf - # 2. Only if it matches: remove the old entry and connect again ssh-keygen -R server.example.com ssh-keygen -R 203.0.113.10 - 2.
为大批服务器使用 SSH 主机证书
信任主机 CA 的客户端会接受重建后的服务器,只要新密钥由该 CA 签名即可,无需逐台主机固定密钥。
text # known_hosts: trust host keys signed by your SSH CA instead of pinning each key @cert-authority *.internal.example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... ssh-host-ca