【茶包射手日記】SSH 無法連線:Incorrect Signature
0 |
嘗試 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