找不到 AES-256-GCM:客户端能力问题还是协商问题
两个 OpenVPN 报错看起来相似:构建版本不含该算法,以及对端没有共同密码套件。先读 --show-ciphers 与 data-ciphers,再改配置。
一个在别处能用的 OpenVPN 配置,却报出找不到 AES-256-GCM,或者报出两端没有共同密码套件,第一反应往往是去改配置。这两条信息描述的是两种不同的失败。一种说本机程序根本没有这个算法;另一种说两端都有算法,但没有共同的选择。在弄清自己属于哪一种之前,改配置两边都修不好。
读一下报错原文,以及产生它的那个程序。
先判断是哪一种错误
找不到密码套件这条信息来自本机的参数解析,发生在发出任何数据包之前。它意味着你面前的这个可执行文件,或者它链接的库,并不提供该算法。没有共同密码套件这条信息出现得更晚,发生在协商阶段,意味着双方都支持密码套件,却选不出同一个。
区分这两种情况很要紧,因为一个是软件版本问题,另一个是配置问题。前者由版本号决定。后者要靠对比两张清单来决定。
本地能力缺口
旧的社区构建早于现代默认值,而桌面应用可能自带引擎,与旁边安装的命令行包并不相同。检查要在真正发起连接的那个可执行文件上做,然后换一个受支持的构建,而不是指望教会旧程序一个新算法。
openvpn --version openvpn --show-ciphers | grep -i gcm openvpn --show-tls | head -5
如果那张清单里没有 AES-256-GCM,任何配置行都加不出来。解决办法是换更新的客户端或另一个构建,而旧对端的限制就变成一个单独的设计问题。
在基于 OpenVPN 3 的客户端上,引擎和可接受的指令都与社区 2.x 系列不同,所以同一段配置文本可能因为与密码清单毫无关系的原因而失败。
协商缺口
当两端都列出算法时,剩下的问题就是各自给出的是哪张清单。社区版 OpenVPN 改过协商指令的名字:2.4 的 ncp-ciphers 在 2.5 变成 data-ciphers,而 2.6 里旧的 cipher 行主要用于兼容和回退,不再用来定义协商集合。
这也是为什么只改旧的 cipher 行,协商清单可能纹丝不动。旧行对回退仍然重要,而那是另一件事。把两者混为一谈,就会做出看不出任何变化的修改。
openvpn --version | head -2 grep -n -E '^(data-ciphers|ncp-ciphers|cipher|tls-cipher)' server.conf client.ovpn
对比两端的清单,以及服务端的拒绝信息。如果交集为空,就明确地把清单对齐,而不是从一篇针对别的版本写的文章里照抄一个值。清单太宽会悄悄削弱每一条连接。清单太窄则会把你想保留的那一端排除在外。
把兼容性写明白
为一个旧对端保留回退,是有代价的决定:整个部署接受一个更弱的选项,只为让一台设备能连上。要把它如实写下来,并且限定在真正需要它的那一端。
结果由两个条件决定。如果错误在本地,就更换构建。如果错误出在协商,就在两端对齐清单,并记下你支持哪些版本。
然后把确切的报错连同版本和能力输出一起报出来。这一对材料能把缺少算法和谈不拢分开,也能在下一轮猜测性修改开始之前把它挡住。