在 Arch Linux 上更新到 OpenVPN v2.4.7 和 OpenSSL 1.1.1c 后,我无法连接到之前使用的服务器:
➜ untangle-vpn sudo openvpn --verb 11 --config ./config.ovpn
Fri Jun 7 21:46:11 2019 OpenVPN 2.4.7 [git:makepkg/2b8aec62d5db2c17+] x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Feb 19 2019
Fri Jun 7 21:46:11 2019 library versions: OpenSSL 1.1.1c 28 May 2019, LZO 2.10
Fri Jun 7 21:46:11 2019 TCP/UDP: Preserving recently used remote address: [AF_INET]XX.XXX.XXX.XXX:XXXX
Fri Jun 7 21:46:11 2019 UDP link local: (not bound)
Fri Jun 7 21:46:11 2019 UDP link remote: [AF_INET]XX.XXX.XXX.XXX:XXXX
Fri Jun 7 21:46:11 2019 Certificate does not have key usage extension
Fri Jun 7 21:46:11 2019 OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed
Fri Jun 7 21:46:11 2019 TLS_ERROR: BIO read tls_read_plaintext error
Fri Jun 7 21:46:11 2019 TLS Error: TLS object -> incoming plaintext read error
Fri Jun 7 21:46:11 2019 TLS Error: TLS handshake failed
运行我们的 VPN 服务器的人似乎不太可能很快重新颁发带有密钥使用扩展的证书。
我可以以某种方式跳过密钥使用扩展检查吗?
我当前的配置:
➜ untangle-vpn head -n 15 ./config.ovpn
client
resolv-retry 20
keepalive 10 60
nobind
mute-replay-warnings
remote-cert-tls server
comp-lzo
verb 1
persist-key
persist-tun
explicit-exit-notify 1
dev tun
proto udp
port 1194
cipher AES-128-CBC
答案1
是的,删除该remote-cert-tls server
选项。
(或者,如果您仍想检查“扩展密钥使用”扩展,但不检查“密钥使用”,请将选项替换为remote-cert-eku "TLS Web Server Authentication"
openvpn 手册页中所示的选项。)
--remote-cert-tls client|server
Require that peer certificate was signed with an explicit key usage and
extended key usage based on RFC3280 TLS rules.
[...]
The --remote-cert-tls server option is equivalent to --remote-cert-ku
--remote-cert-eku "TLS Web Server Authentication"
答案2
我意识到,在作者的问题下发表以下评论后,提供使用正确的 EKU 正确生成服务器和客户端证书所需的代码可能会有所帮助。
删除 EKU 要求从各方面来说都是一个坏主意,会破坏 VPN 的安全性 -不建议在任何情况下都不要这样做。如果“运行我们 VPN 服务器的人”是第三方,请寻找其他供应商,因为他们显然不明白自己在做什么。如果这些人在您的公司,请直接与他们联系以正确配置 VPN 服务器,因为他们也不明白自己在做什么。有问题的 EKU 可防止 MITM 攻击。请参阅扩展密钥使用部分这回答 EKU 定义
openssl.cnf
我将更深入地 介绍 V3 配置文件、KU 和 EKU这回答
VPN 服务器:
[ v3_vpn_server ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment, keyAgreement
extendedKeyUsage = critical, serverAuth
subjectAltName = @alt_vpn_server
keyUsage
:nonRepudiation
:防止签名实体错误地否认某些行动digitalSignature
:用于实体和数据来源的完整性认证
以下两个 KU 允许使用所有密码:
选择其中一个,而不是同时选择两个,会限制服务器可以使用的密码keyEncipherment
:用于加密对称密钥,然后将其传输到目标keyAgreement
:允许使用密钥协议与目标建立对称密钥
extendedKeuUsage
:serverAuth
:服务器身份验证,区分客户端通过哪个服务器进行身份验证
所需 KU:digitalSignature
,keyEncipherment
或keyAgreement
VPN 客户端:
[ v3_vpn_client ]
basicConstraints = critical, CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer:always
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = critical, clientAuth
subjectAltName = @alt_vpn_client
extendedKeuUsage
:clientAuth
:客户端身份验证,区分客户端作为客户端仅有的
所需 KU:digitalSignature
和/或keyAgreement
答案3
openssl-1.1.0j
相关方面发生了一些变化MD5
(默认情况下禁用支持),因此需要启用它。
我添加了一行Environment="OPENSSLENABLEMD5VERIFY=1 NSSHASHALGSUPPORT=+MD5"
[Service]
在文件的部分下/usr/lib/systemd/system/[email protected]
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application (Config: %I)
After=network.target
PartOf=openvpn.target
[Service]
Environment="OPENSSL_ENABLE_MD5_VERIFY=1 NSS_HASH_ALG_SUPPORT=+MD5"
PrivateTmp=true
Type=forking
PIDFile=/var/run/openvpn/%i.pid
ExecStart=/usr/sbin/openvpn --daemon --writepid /run/openvpn/%i.pid --cd /etc/openvpn/ --config %i.conf
[Install]
WantedBy=openvpn.target
我还删除了ns-cert-type
或者remote-cert-tls
OpenVPN 客户端配置文件中的选项
client.conf
#ns-cert-type server
#remote-cert-tls server
cert /etc/openvpn/client/yateucn_client.crt