這個報錯到底什麼意思
"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.