本文目录导读:

OpenVPN 本身就是一个基于 TLS/SSL 的隧道技术,但当我们讨论“OpenVPN 如何实现 TLS 隧道”时,通常指的是其控制通道使用 TLS 进行身份验证和密钥交换,然后数据通道使用加密后的隧道传输数据。
OpenVPN 的 TLS 隧道工作流程分为以下几个核心步骤:
架构与预先准备(PKI 基础设施)
在建立隧道之前,需要建立一个公钥基础设施(PKI,Public Key Infrastructure),这通常包括:
- CA(证书颁发机构):自签名的根证书。
- 服务器证书:由 CA 签署,用于证明服务器身份。
- 客户端证书:由 CA 签署,用于证明客户端身份。
- Diffie-Hellman(DH)参数:用于生成会话密钥。
- (可选) TLS 加密密钥:用于进一步保护控制通道。
建立 TLS 隧道的过程(控制通道)
这是 OpenVPN 最核心的部分,它直接复用了 OpenSSL 或 mbed TLS 库 的 TLS 握手协议。
第一步:TCP/UDP 连接
- 客户端向服务器的
1194(默认端口)发起 TCP 或 UDP 连接。 - 注意:虽然 OpenVPN 默认使用 UDP,但控制通道的握手过程仍然会在 UDP 之上模拟一个可靠的 TLS 会话,如果使用 TCP,则更直接。
第二步:TLS 握手(双向验证)
这一点与 HTTPS 类似,但 OpenVPN 强制要求双向验证(服务器验证客户端,客户端也验证服务器)。
- Hello 与版本协商:客户端发送支持的 TLS 版本(如 TLS 1.2/1.3)和加密套件列表,服务器选择双方都支持的版本和套件。
- 证书交换:
- 服务器发送自己的服务器证书给客户端。
- 服务器请求客户端提供证书。
- 客户端发送自己的客户端证书给服务器。
- 证书验证:
- 客户端验证服务器:客户端检查服务器证书是否由信任的 CA 签发、是否过期、域名是否匹配(使用
remote-cert-tls指令)。 - 服务器验证客户端:服务器检查客户端证书是否由信任的 CA 签发、是否被吊销。
- 客户端验证服务器:客户端检查服务器证书是否由信任的 CA 签发、是否过期、域名是否匹配(使用
- 密钥交换:
- 使用 Diffie-Hellman 或 ECDH 算法,客户端和服务器在不安全的通道上协商出一个预主密钥。
- 这个预主密钥通过证书中的公钥加密传输,只有持有对应私钥的一方才能解密。
- 生成会话密钥:双方利用预主密钥,通过伪随机函数(PRF,Pseudorandom Function)生成用于后续加密的主密钥和会话密钥。
- 完成握手:双方发送 Finished 消息,确认握手完成。
至此,一条加密的 TLS 控制通道已经建立。 这条通道用于安全地交换后续的配置信息和数据通道密钥。
建立数据通道(加密隧道)
当 TLS 控制通道建立后,服务器和客户端通过这个安全通道来协商数据通道的加密参数:
- 密钥交换:通过已经安全的 TLS 控制通道,服务器和客户端交换用于数据通道的临时密钥(通常是 AES-256-GCM 或类似算法的密钥)。
- 密钥轮换:为了提高安全性,OpenVPN 会定期(默认每 60 分钟)通过 TLS 控制通道重新生成新的数据通道密钥(完美前向保密,PFS,Perfect Forward Secrecy)。
之后,所有的 VPN 流量(你的网页访问、邮件、文件传输等)都通过这条数据通道进行加密传输。 这条数据通道使用相对轻量级的对称加密(如 AES),速度较快。
核心机制总结
| 阶段 | 协议/技术 | 作用 | 特点 |
|---|---|---|---|
| 控制通道 | TLS(基于 OpenSSL) | 身份验证(双向证书)、密钥协商、配置信息交换 | 使用公钥加密、握手过程完整、安全性高但速度慢 |
| 数据通道 | 自定义协议 + 对称加密 | 传输实际的 VPN 数据包 | 使用对称加密(AES等)、速度快、周期性更换密钥 |
常见配置示例(关键指令)
在 OpenVPN 的配置文件中,与 TLS 隧道直接相关的指令包括:
# 服务器端 port 1194 proto udp # 使用UDP传输TLS握手数据 dev tun # TLS 控制通道配置 ca ca.crt # CA证书,用于验证对方证书 cert server.crt # 服务器自己的证书 key server.key # 服务器私钥(需保密) dh dh2048.pem # Diffie-Hellman参数,用于密钥交换 # 数据通道加密(通过TLS控制通道协商) cipher AES-256-GCM # 数据通道使用的加密算法 auth SHA256 # 数据通道使用的认证算法 # TLS 1.2或1.3版本 tls-version-min 1.2
# 客户端 client dev tun remote your-server.com 1194 # TLS 控制通道配置 ca ca.crt # 信任的CA证书 cert client.crt # 自己的证书 key client.key # 自己的私钥 # 验证服务器证书(防止中间人攻击) remote-cert-tls server # 数据通道加密(必须与服务器一致) cipher AES-256-GCM
进阶特性:TLS 加密(tls-crypt / tls-auth)
这是 OpenVPN 独有的增强功能,在 TLS 握手之前 再加一层加密:
- tls-auth:使用预共享密钥对 TLS 握手数据包进行 HMAC 签名和验证,可以防止恶意数据包干扰握手过程(防 DoS 攻击),但数据包本身不加密。
- tls-crypt:使用预共享密钥对 TLS 握手数据包进行加密和 HMAC 验证,这可以隐藏 OpenVPN 协议(使其看起来像随机噪声)、防御 DoS 攻击,并且是 NSA 防风暴 建议的配置。
配置方式:
# 双方都加上 tls-crypt ta.key
OpenVPN 的 TLS 隧道实现了一个 “双重通道” 架构:
- 外层:加密的 TLS 控制通道(用于安全地握手和交换密钥,使用证书进行双向认证)。
- 内层:快速的 数据通道(通过 TLS 通道安全地协商出对称密钥,然后使用该密钥加密实际的 VPN 数据包)。
这种方式结合了 TLS 强大的身份验证能力和对称加密的高吞吐量,如果启用了 tls-crypt,则整个会话在握手之前就已经是加密的,极大提高了隐私性和安全性。