![尽管已配置,OpenVPN HMAC 身份验证仍失败](https://linux22.com/image/203120/%E5%B0%BD%E7%AE%A1%E5%B7%B2%E9%85%8D%E7%BD%AE%EF%BC%8COpenVPN%20HMAC%20%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E4%BB%8D%E5%A4%B1%E8%B4%A5.png)
我正在尝试设置一个新设备来连接到我的 OpenVPN 服务器。新设备是一个没有GUI的Linux系统。我从桌面 Linux 系统导出配置文件并进行了必要的更改。
桌面系统可以连接VPN。但是新系统无法连接。日志报告 TLS 握手超时。在服务器上我看到以下条目:
TLS Error: cannot locate HMAC in incoming packet from ...
这表明客户端尚未配置 HMAC 身份验证,但服务器期望进行 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 密钥在所有系统上都是相同的。怎么了?
答案1
一些背景:HMAC 身份验证是一项附加安全功能。即使在握手发生之前,客户端也必须使用预共享密钥对请求进行签名。如果请求不带有有效的 HMAC 签名,服务器将忽略该请求。对于 UDP,这相当于防火墙阻止来自该客户端的流量。
就我而言,与另一个客户端进行比较后,新系统上的配置文件似乎缺少该行
auth SHA256
从 Linux 桌面盒导出的文件中缺少此内容,但 Android 客户端的配置显示了它。添加此选项后,握手起作用(直到我遇到另一个不相关的错误)。
结论:如果没有auth
,OpenVPN 要么不使用 HMAC 身份验证,要么回退到默认的哈希算法(我还没弄清楚是哪种情况)。无论哪种方式,这很可能会导致 HMAC 不匹配,从而导致服务器丢弃客户端请求。
我已经提交了一份功能要求tls-auth
当指定但未指定时,项目会发出警告auth
。