VPN 里的对称加密与公钥加密:各自负责什么
VPN 用公钥证明对端身份,再用派生出的会话密钥加密数据包。请把证书和流量密钥当作两类不同的对象。
人们常把 VPN 描述成“用公钥加密的东西”,继而想象每个数据包都由服务器证书锁住。这个印象在阅读配置文件或抓包结果时会造成实打实的误导。VPN 的公钥那一半,负责证明对端是谁并就秘密材料达成一致;对称那一半才真正保护流量,一个包接一个包,贯穿整个会话。
两半的寿命、失败方式和可安全公开的内容都不同。一旦分开看,“RSA 2048 是否比 AES-128 弱”这类问题就不再令人困惑,因为二者从来不可比。
常被混为一谈的三种操作
公钥密码学是至少三种不同操作的统称。签名证明私钥持有者认可了某条消息。密钥协商让双方用公开交换的数值导出一个共享秘密。公钥加密则把数据藏在某人的公钥之下,只有私钥才能打开。
VPN 握手主要用前两种。证书不是加密密钥,而是把名字绑定到公钥的签名声明,让另一方决定是否信任刚收到的密钥。例如 TLS 1.3 的密钥建立基于 (EC)DHE 密钥协商加证书签名,而不是用服务器公钥去加密会话。
握手究竟产出了什么
在现代握手中,双方各生成临时密钥对,交换公钥部分,算出从不经过线路的共享秘密。该秘密再经过密钥派生函数,产生每个方向各自的密钥,以及记录层所需的 nonce 与 IV 材料。WireGuard 用它基于 Noise 的结构完成这些;TLS 1.3 则用 HKDF 在握手转录上完成。
长期凭据——证书与私钥,或静态 WireGuard 密钥——用来认证这次交换。它在转录上签名或混入其中,使陌生人无法冒充对端完成握手。此后凭据并不逐包做事。若真如此,每个包都要做一次私钥运算,繁忙隧道就会被栈中最慢的运算卡住。
由此带来两个副作用。第一,会话密钥每次都是新的,所以日后窃取长期密钥的攻击者无法解密此前录下的会话,前提是那次协商是临时的。第二,会话密钥泄露只危及一个会话,而不危及身份。
为什么大流量使用对称密钥
对称密码很能扛量:AES-GCM 或 ChaCha20-Poly1305 用已在内存中的密钥处理每个包,认证头部并递增计数器。接收方检查 nonce 和认证标签,丢弃失败或重放的包。这便宜到能在普通硬件上跑满线速,而且同一套结构一次过就给出机密性与完整性。
这套结构也是最容易出实现缺陷的地方。GCM 里 nonce 重复会同时破坏机密性与真实性,因此协议按方向派生密钥,并维护显式的计数器或世代。读抓包时,若密文长度等于明文加上固定开销,那在干活的是对称层,而不是逐包的公钥运算。
生命周期、密钥轮换与前向保密
会话密钥本就该过期。TLS 1.3 允许 KeyUpdate 消息滚动流量密钥;WireGuard 在设定时间或消息数之后更新会话,并为在途数据包短暂保留旧密钥。OpenVPN 按计划重新协商其数据通道的密钥,由 reneg-sec 控制间隔。
这些轮换都不等于更新证书。证书可以一年有效,而会话密钥每隔几分钟就换一次,证书也能在不碰运行中隧道密钥的情况下替换。规划到期时,先问自己在轮换哪个对象;答案决定客户端是重连,还是只更新密钥。
不混淆对象地阅读配置与诊断
实践中你要挑选完整协议及其支持的密码原语,而不是自己拼一套。OpenVPN 的 --tls-crypt 密钥保护控制通道,数据通道使用协商出的对称密码。WireGuard 的 PrivateKey 与 PublicKey 条目是身份材料,传输密钥则在内部派生。把这些字段当作同一种秘密来读,就会犯下把公钥贴到私钥该在之处这类错误。
把公开材料与私密材料分开。证书、WireGuard 公钥和指纹可以安全地贴在工单里。私钥、预共享密钥和导出的会话密钥不行。比较强度时要在同一类型内比较:椭圆曲线标识、RSA 模数大小和 AES 密钥大小 在不同假设下度量的是不同东西。TLS 1.3 规范是理解两层如何咬合的有用参考,即便你的隧道不是 TLS。