OpenVPN 证书没有密钥使用扩展

Utg*_*rda 4 networking linux vpn openvpn ssl

在 Arch Linux 上更新到 OpenVPN v2.4.7 和 OpenSSL 1.1.1c 后,我无法连接到之前使用的服务器:

\n\n
\xe2\x9e\x9c  untangle-vpn sudo openvpn --verb 11 --config ./config.ovpn\nFri 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\nFri Jun  7 21:46:11 2019 library versions: OpenSSL 1.1.1c  28 May 2019, LZO 2.10\nFri Jun  7 21:46:11 2019 TCP/UDP: Preserving recently used remote address: [AF_INET]XX.XXX.XXX.XXX:XXXX\nFri Jun  7 21:46:11 2019 UDP link local: (not bound)\nFri Jun  7 21:46:11 2019 UDP link remote: [AF_INET]XX.XXX.XXX.XXX:XXXX\nFri Jun  7 21:46:11 2019 Certificate does not have key usage extension\nFri Jun  7 21:46:11 2019 OpenSSL: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed\nFri Jun  7 21:46:11 2019 TLS_ERROR: BIO read tls_read_plaintext error\nFri Jun  7 21:46:11 2019 TLS Error: TLS object -> incoming plaintext read error\nFri Jun  7 21:46:11 2019 TLS Error: TLS handshake failed\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行我们 VPN 服务器的人似乎不太可能很快重新颁发带有密钥使用扩展的证书。

\n\n

我可以以某种方式跳过密钥使用扩展检查吗?

\n\n

我当前的配置:

\n\n
\xe2\x9e\x9c  untangle-vpn head -n 15 ./config.ovpn\nclient\nresolv-retry 20\nkeepalive 10 60\nnobind\nmute-replay-warnings\nremote-cert-tls server\ncomp-lzo\nverb 1\npersist-key\npersist-tun\nexplicit-exit-notify 1\ndev tun\nproto udp\nport 1194\ncipher AES-128-CBC\n
Run Code Online (Sandbox Code Playgroud)\n

JW0*_*914 8

我意识到,在作者的问题下发布以下评论后,提供使用正确的 EKU 正确生成服务器和客户端证书所需的代码可能会有所帮助。

  • 删除 EKU 要求总体来说是一个坏主意,并且会破坏 VPN 的安全性 -在任何情况下都不建议这样做。如果“运行我们 VPN 服务器的人”是第三方,请寻找其他供应商,因为他们显然不明白自己在做什么。如果这些人在您的公司中,请直接与他们联系以正确配置 VPN 服务器,因为他们也不明白自己在做什么。相关 EKU 可防止 MITM 攻击。请参阅答案中的 ExtendedKeyUsage 部分以了解 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
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)
  • extendedKeuUsage:
    • clientAuth客户端身份验证,将客户端区分为仅客户端
      所需的 KU:digitalSignature和/或keyAgreement


use*_*686 6

是的,删除该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"
Run Code Online (Sandbox Code Playgroud)