TLS 1.3 握手协议相比 1.2 的改进

FreeGuideOnline 最新 2026-07-09

TLS 1.3 握手协议:核心改进详解

TLS 1.3 是传输层安全协议的重大升级,其握手过程在速度、安全性和简洁性上相比 TLS 1.2 有了根本性改变。本教程将带你逐步理解这些改进,无需任何密码学背景知识。

1. 握手往返时间(RTT)大幅缩短

性能是 TLS 1.3 最直观的进步,它将典型握手从两次往返减少到一次,甚至支持零往返恢复。

1.1 TLS 1.2 的两次往返

传统 TLS 1.2 完整握手需要 2-RTT:

  • 第一次往返:客户端发送 ClientHello,服务器回复 ServerHello、证书及 ServerHelloDone
  • 第二次往返:客户端发送预主密钥(加密后)、参数确认,双方各自生成会话密钥。然后才开始发送应用数据。 整个密钥协商和数据加密需要两次完整的来回通信。

1.2 TLS 1.3 的一次往返(1-RTT)

TLS 1.3 将握手压缩为 1-RTT:

  • 客户端在首次 ClientHello 中附带“密钥分享”参数(如椭圆曲线公钥和猜测的服务器偏好)。
  • 服务器立即回复 ServerHello、证书、完成消息,并同样发送自己的密钥分享参数。
  • 双方此时已拥有足够信息生成会话密钥,客户端可以立即发送加密的应用数据跟随在握手消息之后。 RTT 从 2 降为 1,延迟降低约一倍。

1.3 零往返恢复(0-RTT)

对于曾经连接过的服务器,TLS 1.3 支持 0-RTT 模式:

  • 客户端存储服务器之前分发的“预共享密钥”(PSK)。
  • 当再次连接时,客户端在第一个 ClientHello 中同时发送应用数据,该数据由 PSK 派生密钥加密。
  • 服务器若接受该 PSK,则可立即解密首批数据。 这对移动网络等延迟敏感场景提升巨大,但需注意 0-RTT 数据存在重放攻击风险,适合幂等请求。

2. 精简并强化安全:移除过时算法

TLS 1.3 采取了“减法”原则,直接删除了所有已知不安全的加密组件,从根本上杜绝降级攻击。

2.1 不再支持的算法

协议正式移除:

  • RSA 密钥交换:因为不具备前向安全性,已被彻底禁用。TLS 1.3 强制使用 (EC)DHE 密钥协商。
  • 静态 DH 和静态 ECDH:同样缺乏前向安全。
  • CBC 模式对称加密:已知易受 BEAST、Lucky13 等时序攻击。
  • RC4、3DES 等流密码
  • SHA-1 哈希算法:证书签名和交换中强制使用 SHA-256 或更强算法。
  • 自定义 DH 组和 EXPORT 强度导出

2.2 精简后的密码套件

TLS 1.3 的密码套件不再指定密钥交换算法,因为所有套件都隐含了(EC)DHE 密钥交换。套件定义仅包含:

  • 对称加密算法和密钥长度(仅限 AEAD 模式,如 AES-GCM、ChaCha20-Poly1305)
  • 哈希伪随机函数(PRF,如 SHA256、SHA384) 示例套件:TLS_AES_128_GCM_SHA256,根本无需协商密钥交换方式,大幅减少了配置复杂度和协商空间。

3. 握手加密与更早的机密性

在 TLS 1.2 中,很多握手消息(如证书)以明文传输,直到 ChangeCipherSpec 之后才加密。TLS 1.3 则尽早加密握手。

3.1 加密握手消息

TLS 1.3 握手流程分割为三个加密阶段:

  • 初始阶段ClientHelloServerHello 后的 EncryptedExtensions 即开始加密。
  • 服务器认证阶段:证书、证书验证、完成消息全部在加密通道内发送。
  • 客户端认证阶段:客户端的证书等同样加密。 这意味着攻击者无法从流量中嗅探到服务器身份(证书),甚至无法判断是否使用了客户端证书,大幅增强了隐私。

3.2 清理无意义的 ChangeCipherSpec

TLS 1.2 中为了显式通知开始加密而引入 ChangeCipherSpec 消息,它本身无实际安全作用。TLS 1.3 将其完全删除,通过握手消息的“完成”消息隐式切换到加密状态,使协议更清晰,同时避免中间件因错误的 ChangeCipherSpec 处理而引发漏洞。

4. 强化前向安全性

前向安全性(PFS)确保过去会话的保密性,即使服务器私钥未来泄露,历史通信也无法被解密。

4.1 TLS 1.2 的前向安全依赖配置

TLS 1.2 中如果使用 RSA 密钥交换,会话密钥由客户端加密传输,完全依赖服务器私钥保密。一旦私钥泄露,所有记录历史均被破译。只有使用 DHE/ECDHE 套件才具备前向安全,但并非默认必选。

4.2 TLS 1.3 强制前向安全

TLS 1.3 仅使用临时密钥交换((EC)DHE),每次握手生成临时的公私钥对,会话密钥的产生基于这些临时值。服务器长期私钥仅用于身份签名,不参与密钥交换。因此,TLS 1.3 所有会话天然就是前向安全的。

5. 简化签名算法协商

在 TLS 1.2 中,签名算法的协商依赖扩展(signature_algorithms),过程复杂且易出错。TLS 1.3 将其提升为握手核心部分:

  • 客户端在 ClientHello 发送支持的签名算法列表(如 rsa_pkcs1_sha256ecdsa_secp256r1_sha256)。
  • 服务器选择并明确通过 CertificateVerify 消息中的 signature_scheme 字段指示所用算法。 协商路径直接且强制,避免了降级攻击,并统一使用了哈希+签名格式。

6. 握手状态机极简化

TLS 1.2 的状态机复杂,包含多种重复性的飞行消息和多种可选消息。TLS 1.3 删除了大量冗余内容:

  • 删除 ServerKeyExchange:密钥分享参数直接包含在 ServerHello 扩展中。
  • 删除 ChangeCipherSpec(如前所述)。
  • 合并 ServerHelloEncryptedExtensions,形成紧凑的响应。 最终握手简化为几个固定的线性步骤,实现更简单,漏洞表面大幅缩小。

7. 总结对比表

特性 TLS 1.2 TLS 1.3
完整握手时延 2-RTT 1-RTT(0-RTT 恢复可能)
前向安全性 可选项,依赖套件 强制,天然支持
加密算法 包含 CBC、RC4 等 仅 AEAD 模式
密钥交换 RSA、DH、ECDHE 等多种 仅 (EC)DHE 临时密钥
握手加密 部分握手消息明文 证书等全部加密
冗余消息 存在 ChangeCipherSpec 等 删除冗余,状态机简洁
降级保护 依赖扩展 内置降级防护

TLS 1.3 的改进不仅是性能提升,更代表了一种“简单即安全”的设计哲学,消除了因协议自身复杂度带来的历史包袱。对于开发者而言,部署 TLS 1.3 也只需极简的配置,即可默认享受这些安全优势。