我正在尝试设置一个新设备来连接到我的 OpenVPN 服务器。新设备是一个没有 GUI 的 Linux 系统。我从桌面 Linux 系统导出了配置文件并进行了必要的更改。
桌面系统可以连接到 VPN。但是,新系统无法连接。日志报告 TLS 握手超时。在服务器上,我看到以下条目:
TLS Error: cannot locate HMAC in incoming packet from ...
这表明客户端尚未配置 HMAC 身份验证,但服务器需要它。然而,这个配置是从一个可以工作并配置了 HMAC 密钥的客户端导出的。这是客户端配置:
client
remote 'vpn.example.org'
ca 'ca.pem'
cert 'cert.pem'
key 'key.pem'
cipher AES-128-CBC
dev tun
proto udp
verify-x509-name 'vpn.example.org'
tls-auth 'hmackey.pem' 1
nobind
auth-nocache
script-security 2
persist-key
persist-tun
HMAC 密钥在所有系统上都是相同的。怎么了?
一些背景知识:HMAC 身份验证是一项附加的安全功能。即使在握手发生之前,客户端也必须使用预共享密钥对请求进行签名。如果请求不带有有效的 HMAC 签名,服务器将忽略该请求。使用 UDP,这相当于防火墙阻止来自该客户端的流量。
就我而言,在与另一个客户端进行比较后,新系统上的配置文件似乎缺少该行
从 Linux 桌面框导出的文件中缺少此内容,但 Android 客户端的配置显示了它。添加此选项后,握手工作(直到我遇到另一个不相关的错误)。
结论:没有
auth
,OpenVPN 要么不使用 HMAC 身份验证,要么回退到默认的哈希算法(我还没弄清楚是哪种情况)。无论哪种方式,这很可能会导致 HMAC 不匹配,从而导致服务器丢弃客户端请求。我已向项目提交功能请求
tls-auth
,以便在指定但未指定时发出警告auth
。