‹ 指南

旧版 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 已经旧到值得升级了。