當目標伺服器重裝系統、更換主機金鑰或遭遇中間人攻擊時,SSH 客戶端會拒絕連線並顯示 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!。本文說明錯誤原因、快速修復與長期配置策略。
SSH 客戶端在 ~/.ssh/known_hosts 儲存已連線主機的公鑰指紋。再次連線時會比對:
常見觸發場景:目標機重裝 OS、更換 SSH 金鑰、IP 變更指向新主機、DNS 劫持、負載均衡後端輪換。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Please contact your system administrator.
Add correct host key in /home/user/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/user/.ssh/known_hosts:8
Host key verification failed.
# 移除指定主機的舊記錄
ssh-keygen -R 目標IP或主機名
# 例如:
ssh-keygen -R 192.168.1.100
ssh-keygen -R myserver.example.com
執行後再次連線會提示新指紋確認,輸入 yes 即可重新建立信任。
vi ~/.ssh/known_hosts
# 刪除對應目標 IP/主機名的那一行
ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host
vi /etc/ssh/ssh_config
# 或 ~/.ssh/config
# 加入:
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
風險:完全失去中間人攻擊防護,僅建議用於完全可控的內網測試環境。
Host 192.168.1.*
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
LogLevel ERROR
Host production-*
StrictHostKeyChecking ask
UserKnownHostsFile ~/.ssh/known_hosts
這樣內網測試機自動接受新金鑰,生產環境維持嚴格驗證。
若透過跳板機連線目標,錯誤可能來自:
ssh-keygen -R 目標IP| 場景 | 建議做法 |
|---|---|
| 目標機確認重裝/換鑰 | ssh-keygen -R host 移除舊記錄,重新信任 |
| 內網測試機頻繁重裝 | ~/.ssh/config 針對網段設定 StrictHostKeyChecking no |
| 生產環境正常運維 | 嚴格驗證,任何指紋變更需調查確認 |
| 自動化部署腳本 | 預先掃描金鑰 ssh-keyscan host >> known_hosts,避免互動提示 |
# 掃描並寫入 known_hosts(首次部署自動化適用)
ssh-keyscan -t rsa,ecdsa,ed25519 192.168.1.100 >> ~/.ssh/known_hosts
ssh-keyscan -t rsa,ecdsa,ed25519 myserver.example.com >> ~/.ssh/known_hosts
Host key verification failed 是 SSH 安全機制正常運作的表現。正確做法是確認變更原因,再用 ssh-keygen -R 移除舊記錄。切勿為了方便永久關閉檢查,除非在完全隔離、受控的測試網段。