排錯

"Host key verification failed":什麼意思、怎麼修

伺服器出示的身分金鑰和用戶端記住的不一樣——通常是重裝或 IP 複用,偶爾更糟。怎麼帶外核實新指紋、用 ssh-keygen -R 或在 App 內修、以及怎麼減少這種折騰。

CC Chen Chen· 創始人·2026 年 6 月 24 日·閱讀 5 分鐘

這個報錯到底什麼意思

"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 模型。

核實並接受新主機金鑰後重新連上的 SSH 工作階段
帶外核實新指紋並接受後,用戶端固定新金鑰——一切恢復正常,下次依然有同樣的保護。

減少這種折騰

  • 穩定位址。家庭網路裡大部分"金鑰變了"的雜訊,是 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 內接受新金鑰(行動);永遠別關校驗
Try TermAI

Free on iOS and Android. 5 AI requests/day on the free tier, plus unlimited SSH/SFTP and built-in Tailscale.

CC
Chen Chen — Founder of TermAI

Writes about mobile DevOps, terminal UX, and the surprising depth of "boring" infrastructure.

Was this useful? ← Back to blog