这个报错到底什么意思
"Host key verification failed"(常伴随更响亮的 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)意味着服务器出示的身份密钥和你客户端从以前的连接里记住的那把不一样。SSH 拒绝继续,因为这正是中间人攻击该有的样子。不过实话实说:大多数时候不是攻击——是服务器重装了、IP 被复用了、或虚拟机恢复了。正确的反应是:先弄清密钥为什么变了,再去删旧的。别条件反射地删。
主机密钥为什么会变(良性 vs 可疑)
| 原因 | 良性? | 怎么确认 |
|---|---|---|
| 服务器重装 / 系统重刷 | ✅ 是 | 你(或你的团队)干的 |
| DHCP 把这个 IP 给了另一台机器 | ✅ 是 | 路由器设备列表显示那是别的机器 |
| 云 IP 被新 VPS 复用 | ✅ 是 | 老服务器销毁了,地址被回收 |
| 从备份恢复 / 迁移的虚拟机 | ✅ 通常 | 恢复时重新生成了主机密钥 |
| 以上都不是 | ⚠️ 要查 | 连接前先带外核实指纹 |
第 1 步——带外核实新密钥
如果你有控制台/物理访问(或任何已经可信的会话),在服务器上打印它当前的指纹:
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub 和你客户端警告里的指纹对比。一致 → 变更属实且良性;继续去删旧条目。不一致、且你解释不了这次变更 → 停下来,先调查,别输入任何凭证。(SSH 为什么这样工作:见 主机密钥 TOFU 详解。)
第 2 步——删掉旧密钥,重新连接
桌面上,从 known_hosts 删掉过期条目:
ssh-keygen -R 主机名或IP
# 然后重连、接受新指纹
ssh user@host 移动客户端没有文件可编辑——记住的密钥存在 App 里。在 TermAI 里,密钥变化时你会看到带两个指纹的警告;确认变更合法后,接受新密钥(或在连接设置里清掉保存的主机密钥)再重连。新密钥随即被固定,和 OpenSSH 同样的 TOFU 模型。
减少这种折腾
- 稳定地址。家庭网络里大部分"密钥变了"的噪音,是 DHCP 把机器在 IP 之间洗牌。用 Tailscale,每台机器保持一个地址——你不再连到"同一个 IP 上的不同机器",密钥就不再"变"。
- 重装时保留主机密钥。备份
/etc/ssh/ssh_host_*、重建后恢复,客户端什么都不会察觉。 - 别关掉校验。
StrictHostKeyChecking no关掉的是 SSH 对中间人唯一的防御。修原因,不是关防御。
常见问题
"REMOTE HOST IDENTIFICATION HAS CHANGED" 一定是攻击吗?
不——通常是重装、恢复的虚拟机、或那个 IP 现在属于另一台机器。但因为它也是中间人攻击的样子,接受前先带外核实新指纹。
怎么快速修?
确认变更合法后:桌面 ssh-keygen -R host,移动端在客户端里接受/清除保存的主机密钥,然后重连。
手机把已知主机密钥存在哪?
存在 SSH App 里(不是 known_hosts 文件)。TermAI 按连接固定密钥,变化时给出两个指纹的警告。
快速事实
- 含义:服务器的身份密钥和客户端固定的那把不一致
- 通常良性:重装、IP 复用、恢复的虚拟机——但接受前要核实
- 核实:服务器上
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub,对比指纹 - 修法:
ssh-keygen -R host(桌面)/ App 内接受新密钥(移动);永远别关校验
Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.