OpenVPN 证书没有密钥使用扩展

OpenVPN 证书没有密钥使用扩展

在 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:digitalSignaturekeyEnciphermentkeyAgreement

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-tlsOpenVPN 客户端配置文件中的选项

client.conf

#ns-cert-type server
#remote-cert-tls server
cert /etc/openvpn/client/yateucn_client.crt

相关内容