2. TLS 1.3握手协议:握手流程概览、1-RTT握手、0-RTT握手、握手消息类型

2.1 握手协议核心目标

TLS 1.3握手协议在保证通信安全的前提下,大幅简化了握手流程,将完整的握手延迟从TLS 1.2的2-RTT(两次往返)降低至1-RTT,并可选支持0-RTT模式。其核心目标包括:

  • 身份认证:验证服务器(及可选客户端)的身份真实性。
  • 密钥协商:通过(EC)DHE算法安全地协商出会话密钥。
  • 参数协商:确定加密套件、协议版本、扩展参数等。
  • 前向安全性:确保即使长期私钥泄露,历史会话的通信内容仍受保护。

2.2 1-RTT握手流程概览

1-RTT握手是TLS 1.3的标准模式,仅需一次网络往返即可完成握手并开始加密数据传输。其核心流程分为两个阶段:

  1. ClientHello → ServerHello(第一次往返):客户端发送支持的密码套件、密钥交换参数(Key Share);服务器选择参数并回复自己的密钥交换参数,同时发送证书和证书验证消息。
  2. 客户端完成(第二次单向):客户端验证服务器证书后,发送Finished消息,随后即可发送加密的应用数据。
关键优化: TLS 1.3将服务器证书和证书验证消息合并到ServerHello之后的同一趟飞行中,避免了TLS 1.2中额外的往返延迟。
TLS 1.3 1-RTT 握手流程 客户端 服务器 ClientHello + Key Share ServerHello + Cert + CertVerify Finished + 应用数据 (加密) 时间 ↓ ↓ ↓ 流程说明 1. 客户端发送 ClientHello,包含支持的密码套件和临时公钥 (Key Share)。 2. 服务器回复 ServerHello,选择密码套件并发送自己的临时公钥。 同时发送 EncryptedExtensions、证书 (Certificate) 和证书验证 (CertificateVerify)。 3. 客户端验证证书后发送 Finished 消息,随后即可发送加密的应用数据。 服务器收到 Finished 后也进入连接建立状态,开始处理应用数据。

2.3 0-RTT握手

0-RTT(Zero Round Trip Time)握手允许客户端在第一次消息中就携带加密的应用数据,实现零往返延迟。它基于之前会话中建立的预共享密钥(PSK),适用于会话恢复场景。

适用场景: 0-RTT主要用于HTTP/2连接复用、移动应用频繁重连等对延迟敏感的场景。但需注意重放攻击风险,服务器应实施重放防护措施。

0-RTT握手流程

  1. 初始握手:客户端与服务器完成一次完整的1-RTT握手,服务器在NewSessionTicket消息中下发PSK标识和生命周期。
  2. 0-RTT恢复:客户端在后续连接中,直接在ClientHello中携带PSK标识和early_data扩展,并立即发送加密的0-RTT数据。
  3. 服务器验证:服务器验证PSK有效后,回复ServerHello并立即处理0-RTT数据;若PSK无效,则回退到1-RTT握手。
TLS 1.3 0-RTT 握手流程(会话恢复) 客户端 服务器 ClientHello (PSK) + 0-RTT 数据 (加密) ServerHello + Finished 0-RTT 关键特性 • 前提:客户端必须持有有效的预共享密钥 (PSK),通常来自之前的会话。 • 优势:客户端在第一个消息中即可发送应用数据,消除握手延迟。 • 风险:0-RTT 数据存在重放攻击风险,服务器需实施重放检测或限制。 • 回退机制:若 PSK 无效或过期,服务器可忽略 0-RTT 数据,回退到 1-RTT 握手。 • 应用限制:0-RTT 数据不应包含非幂等操作(如转账请求)。

2.4 握手消息类型

TLS 1.3握手协议定义了以下核心消息类型,它们按照严格的顺序在客户端和服务器之间交换:

消息类型 发送方 内容说明 是否加密
ClientHello 客户端 协议版本、随机数、密码套件列表、Key Share扩展、PSK扩展(可选) 明文
ServerHello 服务器 选择的协议版本、随机数、密码套件、Key Share回复 明文
EncryptedExtensions 服务器 非密钥协商的扩展参数(如SNI、ALPN、max_fragment_length) 加密
CertificateRequest 服务器 请求客户端证书(可选,仅用于双向认证) 加密
Certificate 服务器/客户端 X.509证书链(服务器必须发送,客户端按需发送) 加密
CertificateVerify 服务器/客户端 对握手消息的数字签名,证明证书私钥持有 加密
Finished 客户端/服务器 基于协商密钥的HMAC,验证握手完整性 加密
NewSessionTicket 服务器 下发PSK标识和生命周期,用于后续0-RTT恢复 加密
KeyUpdate 客户端/服务器 更新通信密钥(可选,用于密钥轮换) 加密
安全提示: 除ClientHello和ServerHello外,所有后续握手消息均使用协商出的握手密钥进行加密。这有效防止了中间人窃听握手参数,是TLS 1.3相比TLS 1.2的重要安全增强。

2.5 握手消息顺序对比

下表对比了TLS 1.3中1-RTT和0-RTT握手的消息交换顺序:

步骤 1-RTT 握手 0-RTT 握手
1 Client → Server: ClientHello Client → Server: ClientHello (含PSK) + 0-RTT数据
2 Server → Client: ServerHello, EncryptedExtensions, Certificate, CertificateVerify, Finished Server → Client: ServerHello, EncryptedExtensions, Finished
3 Client → Server: Finished + 应用数据 Client → Server: Finished (可选) + 后续应用数据
4 Server → Client: 应用数据 Server → Client: 应用数据

2.6 握手协议关键设计原则

  • 最小化消息数量:TLS 1.3将握手消息从TLS 1.2的10条以上减少到核心的5-6条,降低了延迟和计算开销。
  • 加密握手消息:除ClientHello/ServerHello外,所有消息均加密,防止参数篡改和中间人攻击。
  • 前向安全性强制:所有密钥交换必须使用临时Diffie-Hellman参数,禁止使用静态RSA密钥交换。
  • 会话恢复优化:通过PSK和0-RTT机制,将恢复握手的延迟降至零往返。
  • 降级保护:通过版本降级检测机制,防止协议降级攻击。