當你在一個現代的 Docker 容器中,嘗試使用 ssh
指令去連線到一個非常舊的 SSH 伺服器時,可能會遇到連線失敗或需要輸入密碼的狀況,即使你已經設定了 SSH Key。這通常不是因為你的金鑰不對,而是因為客戶端與伺服器之間的協議不相容。
問題的根源:演算法不相容
這個問題的核心在於版本差異。新的 Docker 容器通常內建最新的 OpenSSH 客戶端(例如 OpenSSH 8.x 或 9.x),而舊版 SSH 伺服器可能還在使用 OpenSSH 5.x 甚至更舊的版本。
隨著時間的推移,一些舊的加密與金鑰演算法被認為不再安全,例如 ssh-rsa
。為了增強安全性,新版本的 OpenSSH 客戶端預設會停用這些演算法,不再將其納入協商清單。
當你的新客戶端連線到舊伺服器時,雙方會嘗試尋找共同支援的演算法。如果伺服器只支援 ssh-rsa
這種舊演算法,而客戶端又因為安全性考量將其禁用,那麼雙方就無法達成共識,導致連線中斷或退回密碼認證。你可能會在偵錯日誌ssh -v
中看到這樣的訊息:
debug1: send_pubkey_test: no mutual signature algorithm
這清楚地告訴你,客戶端與伺服器之間沒有任何共同的簽章演算法可以使用。
解決方案:啟用被棄用的演算法
要解決這個問題,你需要手動告訴你的 SSH 客戶端,讓它暫時接受並使用舊的 ssh-rsa
演算法。
方法:編輯 SSH 設定檔
在你的 Docker 容器中,編輯或新增 /root/.ssh/config
檔案(或者是 /etc/ssh/ssh_config
),並加入以下內容:
Host old-server
HostName your-server-ip
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
Host old-server
:這告訴 SSH 客戶端,以下設定只針對你為這個舊伺服器設定的別名生效。HostName your-server-ip
:這是實際的伺服器 IP 位址或網域名稱。HostKeyAlgorithms +ssh-rsa
:這允許客戶端接受伺服器使用ssh-rsa
作為其主機金鑰。PubkeyAcceptedAlgorithms +ssh-rsa
:這允許客戶端使用ssh-rsa
來簽署你的公鑰認證請求。
完成設定後,你就可以像往常一樣簡單地使用 ssh old-server
來連線了。
留言