有些交換器、路由器和用了很多年的伺服器只會舊演算法。一個依主機的開關讓 Term 遷就它們 — 而原本含糊的連線失敗,現在會直接說清該怎麼辦。
需要 Term v26.4.1 或更新版本。
撰寫於
每條 SSH 連線都從協商開始:雙方各自列出自己支援的金鑰交換、加密與完整性檢查演算法,再各挑一個。只要有一類雙方沒有交集,就沒有什麼可商量的 — 連線就此結束,在使用者名稱與密碼送出之前。russh 回報的錯誤是 No common Kex algorithm。
以前這只會顯示成一句籠統的「連線失敗」,於是你去查網路、查連接埠、查密碼 — 而問題一個都不在那裡。從 v26.4.1 起,失敗會說清到底發生了什麼、該做什麼,主要按鈕也變成編輯主機:一次沒有共同演算法的交握,再重試多少次也是一樣的結果。
它是依主機的,不是全域設定:開啟該主機,展開進階選項,這一列在靠下的位置。每台主機預設都是關閉的;SSH 與 mosh 主機才有這一項 — telnet 根本沒有交握可協商。
只為那一台需要它的老裝置開啟,應用程式的其他部分不受任何影響。
開關開啟後,Term 會在現代演算法之外額外提供這些:
diffie-hellman-group14-sha1、diffie-hellman-group1-sha1、diffie-hellman-group-exchange-sha1。aes256-cbc、aes192-cbc、aes128-cbc。3des-cbc。hmac-sha1。關鍵詞是「額外」。它們被追加在現代演算法之後,不是取而代之,優先順序沒有變:能用 curve25519 與 AES-GCM 的伺服器,照樣會用 curve25519 與 AES-GCM。只有當對端拿不出更好的選擇時才會落到舊演算法上 — 所以替一台本來就夠新的主機開啟這個開關,它不會有任何損失。
因為這份清單裡的每一個演算法都已經被廢棄,而且各有各的原因。這不是說它們一無是處 — 走這些演算法的連線仍然遠好過 telnet — 但只要伺服器能做得更好,你就不該用它們。
diffie-hellman-group1-sha1 用的是 1024 位元 DH 群。這是規範裡還留著的最小的一個群。2015 年的 Logjam 研究指出,這個長度的群對於願意在預先計算上砸錢的攻擊者是搆得著的 — 而且同一份預先計算可以反覆用於所有共用該群的工作階段。hmac-sha1 是其中最溫和的一個 — HMAC 不像簽章那樣會被碰撞直接擊穿 — 但它仍是這裡最弱的完整性檢查,而且在別處早已被廢棄。所以這個開關預設關閉,並不是因為用它很危險,而是因為它應當是一個有意識、有範圍的例外:為機櫃裡那台永遠不會再升級的交換器開啟,其他一概不開 — 而不是用一個全域設定,為了救一條壞連線,悄悄削弱你手上所有好的連線。
當失敗訊息是 No common Kex algorithm,而對端又是你改不了的東西時就開啟它:一台受管交換器、路由器的主控台、某個專用裝置,或者一台發行版早就停止更新的伺服器。
但不要把它當成「連不上就試試這個」的萬用藥。如果問題不在交握 — 密碼被拒、主機金鑰不認、連接埠沒開、網路根本看不到這台機器 — 開啟它不會有任何變化,因為它只改變協商階段雙方拿出來的清單。失敗卡片上的查看連線日誌會告訴你眼前到底是哪一種。
而如果對端是你能改的,那才是更好的解法:一台需要這個開關的伺服器,它的 SSH 已經舊到值得升級了。