嘗試 SSH 連線某台 Unix 主機時出現 Incorrect Signature 錯誤:

該主機歷史悠久,使用者眾,理論上不該存在無法 SSH 連線問題,所以我優先懷疑是自己客戶端有問題。這種狀況的 SOP 是找對照組比較,我的 SSH 客戶端依據玩 USB 實體金鑰的心得,是用 Win32-OpenSSH 9.2p1 最新版。為了對照分別又試了 Git 附的 ssh.exe ("C:\Program Files\Git\usr\bin\ssh.exe" 9.0p1 版) 及 WSL2 的 ssh (版本為 8.2p1),Git 版一樣出現 Incorrect Signature,WSL2 則可成功連線:

我注意到一點,WSL2 連線傳回的主機金鑰為 ECDSA,而 Win32-OpenSSH 及 Git SSH 則是 Ed25519。依我推測,SSH 連線時雙方會列舉自己支援的電子簽章標準,其中包含 ECDSA 及 Ed25519,新版 OpenSSH (9.0p1、9.2p1) 選擇使用 Ed25519 (當今主流,速度快且安全性高,且無 NSA 後門疑慮,延伸閱讀:數位簽章知識補充包 - ECC 橢圓曲線密碼學),而 WSL2/Ubuntu 的 ssh 8.2p1 則選了 ECDSA。

爬文在 OpenSSH 8.5 發行文件找到證據,從 8.5 版起,SSH 客戶端與伺服器的簽章演算法首選由 ECDSA 換成 Ed25519:

ssh(1), sshd(8): this release changes the first-preference signature algorithm from ECDSA to ED25519.

使用 ssh -vvv 顯示偵測訊息,發現這台古老的 Sun 主機,SSH 伺服器版本為 OpenSSH 6.6,合理推測其 Ed25519 簽章有問題,與新版不相容。通知管理者更新 SSH 伺服器版本的路漫長且又充滿變數,自力救濟才是王道。

最後我找到的解法是先由 WSL2 .ssh/known_hosts 查出 WSL2 ssh 採用的 Host Key 為 ecdsa-sha2-nistp256:

先清除 OpenSSH 9.2p1 先前在 known_hosts 記憶的該主機金鑰,透過 ssh -o HostKeyAlgorithms=ecdsa-sha2-nistp256 <ssh-host> 參數指定使用 ecdsa-sha2-nistp256 金鑰,就能順利連線囉。

再過一關。


Comments

Be the first to post a comment

Post a comment