跳到主要內容

解決 Docker 連線舊版 SSH 伺服器相容性問題

當你在一個現代的 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 來連線了。

留言