有些交换机、路由器和用了很多年的服务器只会旧算法。一个按主机的开关让 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 已经旧到值得升级了。