‹ 指南

舊版 SSH 演算法 v26.4.1+

有些交換器、路由器和用了很多年的伺服器只會舊演算法。一個依主機的開關讓 Term 遷就它們 — 而原本含糊的連線失敗,現在會直接說清該怎麼辦。

需要 Term v26.4.1 或更新版本。

撰寫於

還沒到輸密碼就斷了

每條 SSH 連線都從協商開始:雙方各自列出自己支援的金鑰交換、加密與完整性檢查演算法,再各挑一個。只要有一類雙方沒有交集,就沒有什麼可商量的 — 連線就此結束,在使用者名稱與密碼送出之前。russh 回報的錯誤是 No common Kex algorithm。

以前這只會顯示成一句籠統的「連線失敗」,於是你去查網路、查連接埠、查密碼 — 而問題一個都不在那裡。從 v26.4.1 起,失敗會說清到底發生了什麼、該做什麼,主要按鈕也變成編輯主機:一次沒有共同演算法的交握,再重試多少次也是一樣的結果。

連線失敗卡片:此伺服器只支援本應用程式預設不啟用的舊版 SSH 演算法,主要按鈕是「編輯主機」
卡片點明了原因,也點明了對應的開關。編輯主機是實心按鈕,重試是安靜的那個 — 交握找不到共同演算法,第二次也找不到。

開關在哪裡

它是依主機的,不是全域設定:開啟該主機,展開進階選項,這一列在靠下的位置。每台主機預設都是關閉的;SSH 與 mosh 主機才有這一項 — telnet 根本沒有交握可協商。

只為那一台需要它的老裝置開啟,應用程式的其他部分不受任何影響。

主機進階選項中的「舊版演算法」開關,處於關閉狀態,下面是它的說明
預設關閉,理由就寫在旁邊,而不是藏在某個說明頁裡。

開啟之後多了什麼

開關開啟後,Term 會在現代演算法之外額外提供這些:

  1. SHA-1 金鑰交換 — diffie-hellman-group14-sha1、diffie-hellman-group1-sha1、diffie-hellman-group-exchange-sha1。
  2. CBC 加密 — aes256-cbc、aes192-cbc、aes128-cbc。
  3. 3DES — 3des-cbc。
  4. SHA-1 完整性檢查 — hmac-sha1。

關鍵詞是「額外」。它們被追加在現代演算法之後,不是取而代之,優先順序沒有變:能用 curve25519 與 AES-GCM 的伺服器,照樣會用 curve25519 與 AES-GCM。只有當對端拿不出更好的選擇時才會落到舊演算法上 — 所以替一台本來就夠新的主機開啟這個開關,它不會有任何損失。

為什麼預設關閉

因為這份清單裡的每一個演算法都已經被廢棄,而且各有各的原因。這不是說它們一無是處 — 走這些演算法的連線仍然遠好過 telnet — 但只要伺服器能做得更好,你就不該用它們。

  1. diffie-hellman-group1-sha1 用的是 1024 位元 DH 群。這是規範裡還留著的最小的一個群。2015 年的 Logjam 研究指出,這個長度的群對於願意在預先計算上砸錢的攻擊者是搆得著的 — 而且同一份預先計算可以反覆用於所有共用該群的工作階段。
  2. SHA-1 的碰撞已經被攻破。2017 年公開了可實施的碰撞。金鑰交換不是它最要命的用法,但「不是最要命」並不是繼續把一個已破的雜湊留在交握裡的理由。
  3. CBC 在 SSH 裡會洩漏明文。2008 年針對 SSH CBC 模式的攻擊可以從攔截到的封包中還原出部分明文;OpenSSH 正是因此預設不再提供 CBC。
  4. 3DES 的區塊只有 64 位元。Sweet32 把這一點變成了針對長連線的生日攻擊 — 而終端工作階段恰恰就是那種一開就是幾個小時的連線。
  5. hmac-sha1 是其中最溫和的一個 — HMAC 不像簽章那樣會被碰撞直接擊穿 — 但它仍是這裡最弱的完整性檢查,而且在別處早已被廢棄。

所以這個開關預設關閉,並不是因為用它很危險,而是因為它應當是一個有意識、有範圍的例外:為機櫃裡那台永遠不會再升級的交換器開啟,其他一概不開 — 而不是用一個全域設定,為了救一條壞連線,悄悄削弱你手上所有好的連線。

什麼時候該開,什麼時候不該

當失敗訊息是 No common Kex algorithm,而對端又是你改不了的東西時就開啟它:一台受管交換器、路由器的主控台、某個專用裝置,或者一台發行版早就停止更新的伺服器。

但不要把它當成「連不上就試試這個」的萬用藥。如果問題不在交握 — 密碼被拒、主機金鑰不認、連接埠沒開、網路根本看不到這台機器 — 開啟它不會有任何變化,因為它只改變協商階段雙方拿出來的清單。失敗卡片上的查看連線日誌會告訴你眼前到底是哪一種。

而如果對端是你能改的,那才是更好的解法:一台需要這個開關的伺服器,它的 SSH 已經舊到值得升級了。