Hacking Limbo

Reading / Coding / Hacking

OpenVPN 认证流程

最常用的 OpenVPN 认证方式是 X.509 PKI (Public Key Infrastructure) 认证,也就是我们常说的公钥认证。启用公钥认证的 OpenVPN 连接认证流程大致如下:

  1. 客户端与服务端建立连接。
  2. 服务端发送证书 (server.crt) 给客户端。
  3. 客户端确认 server.crt 是否由指定的 CA 签发。这个步骤要在客户端配置里写 remote-cert-tls server 才会启用,建议启用,否则有被中间人攻击的风险
  4. 客户端发送证书 (client.crt) 给服务端。
  5. 服务端确认 client.crt 是否由指定的 CA 签发,而且证书没有被吊销(即 client.crt 对应的 Common Name 不在服务端的 crl.pem 里)。
  6. 两端的证书校验通过后,建立 TLS 通信信道。

OpenVPN Auth Flow

整个认证过程中,会通过网络传输的只有公钥(server.crtclient.crt),服务端和客户端的私钥都不会离开各自所在的机器。同时为了校验证书签名,双方都持有 CA 的公钥,即 ca.crt. 由此可以得出:

  1. CA 的私钥只用于证书签发,OpenVPN 服务端运行时不会用到。为防止被盗用最好不要存放在服务器上。
  2. 同一个 CA 签发的客户端证书,可以用于所有持有相同 ca.crt 的 OpenVPN 服务端实例。比如要连接部署在两个机房的 VPN A 和 VPN B, 只需给每个人签发一次客户端证书,只是配置文件写的连接地址不同。
  3. 如上所述,客户端会主动发送 client.crt 给服务端,新签发证书之后,不需要在服务端做任何变更。
  4. 同理,虽然很多人习惯在服务器上签发证书(默认位置是 /etc/openvpn),删掉这里的 client.crtclient.key 无法阻止客户端继续连接。正确的证书吊销方式是更新服务端的 CRL (Certificate Revocation List).

参考: