SSH 出現主機金鑰變更警告?先比對指紋再更新 known_hosts

SSH 顯示 REMOTE HOST IDENTIFICATION HAS CHANGED 時,可能是主機重裝、IP 指向另一台機器,也可能是連線受到攔截。這個警告的目的就是阻止你在身分不明時繼續連線,先不要關閉主機金鑰檢查。

確認你連到哪個名稱和埠

記下警告中顯示的主機名稱、埠號、金鑰類型及指紋,並核對 DNS、VPN 與近期維護紀錄。使用名稱和直接使用 IP,可能是不同的 known_hosts 項目;非標準埠一般使用 [主機名稱]:埠號 格式。

ssh-keygen -F server.example.com
ssh-keygen -F "[server.example.com]:2222"

以上在用戶端搜尋預設 known_hosts,亦可找到雜湊的名稱。若 SSH 設定使用自訂 UserKnownHostsFile,需先確認實際路徑,不要只依預設檔案判斷。

從獨立可信管道核對

請透過主機供應商的管理主控台或可信的既有管理通道,讓管理者在伺服器端查詢相同演算法的公鑰指紋:

ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub

將結果與警告顯示的新指紋逐字比對,並確認演算法一致;若主機使用其他金鑰類型,請查對應的 .pub 檔。不要把同一條未驗證連線上取得的指紋當作獨立證據。指紋不符、來源無法確認或變更未預期時,停止並調查。

確認變更後才更新紀錄

確認新金鑰確實屬於預期主機後,先備份用戶端 known_hosts,再只移除受影響的名稱與埠號,重新連線並再次核對提示的指紋後接受。以下範例是標準埠名稱:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.backup
ssh-keygen -R server.example.com
ssh user@server.example.com

Windows 請用檔案總管備份目前使用者的 .ssh\known_hosts,再使用系統 OpenSSH 執行相同 ssh-keygen 命令。自訂檔案需用 -f 指定正確路徑;若多個名稱或 IP 各有記錄,要各自驗證,避免刪除整個清單。

驗證與復原

重新連線後確認系統身分與服務。若移除錯誤項目,可在確認沒有覆蓋其他新變更後還原備份;舊金鑰記錄只能恢復先前信任狀態,不能證明新主機可信。參考 OpenSSH 主機金鑰驗證文件。網路名稱問題也可搭配DNS 解析比對。

非標準埠的完整範例

假設你連的是 server.example.com 的 2222 埠,警告顯示 ED25519 指紋。先透過主機商主控台查詢該主機的 ED25519 公鑰指紋,比對類型及 SHA256 字串;以下指令中的名稱均為範例。

ssh-keygen -F "[server.example.com]:2222"
ssh-keygen -R "[server.example.com]:2222"
ssh -p 2222 user@server.example.com

第二行只在確認新指紋可信並備份後執行。重新連線時看到的指紋仍須與獨立管道結果相同,再輸入 yes。若仍顯示衝突,查看警告列出的檔案與行號,檢查是否另有系統層級 known_hosts 或自訂檔案;不要直接清空它們。

如何分辨常見狀況

若主機商確認該時段重建主機且主控台指紋吻合,可以依上述程序更新。若 DNS 現在指向另一個正式節點,應先確認負載平衡與各節點金鑰管理,不要反覆接受陌生金鑰。若預期沒有變更、指紋不同或主控台不可用,就保留警告與時間並請管理者調查;ssh-keyscan 取得的金鑰仍需要獨立驗證。

備份包含所有已知主機紀錄,屬於連線資訊,應限制存取。還原備份前先比較目前檔案,以免覆蓋其他主機後來新增的合法紀錄;不要把舊紀錄改寫成新指紋來繞過驗證。

相連文章

臉書留言

一般留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *