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的标准模式,仅需一次网络往返即可完成握手并开始加密数据传输。其核心流程分为两个阶段:
- ClientHello → ServerHello(第一次往返):客户端发送支持的密码套件、密钥交换参数(Key Share);服务器选择参数并回复自己的密钥交换参数,同时发送证书和证书验证消息。
- 客户端完成(第二次单向):客户端验证服务器证书后,发送Finished消息,随后即可发送加密的应用数据。
关键优化: TLS 1.3将服务器证书和证书验证消息合并到ServerHello之后的同一趟飞行中,避免了TLS 1.2中额外的往返延迟。
2.3 0-RTT握手
0-RTT(Zero Round Trip Time)握手允许客户端在第一次消息中就携带加密的应用数据,实现零往返延迟。它基于之前会话中建立的预共享密钥(PSK),适用于会话恢复场景。
适用场景: 0-RTT主要用于HTTP/2连接复用、移动应用频繁重连等对延迟敏感的场景。但需注意重放攻击风险,服务器应实施重放防护措施。
0-RTT握手流程
- 初始握手:客户端与服务器完成一次完整的1-RTT握手,服务器在NewSessionTicket消息中下发PSK标识和生命周期。
- 0-RTT恢复:客户端在后续连接中,直接在ClientHello中携带PSK标识和early_data扩展,并立即发送加密的0-RTT数据。
- 服务器验证:服务器验证PSK有效后,回复ServerHello并立即处理0-RTT数据;若PSK无效,则回退到1-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机制,将恢复握手的延迟降至零往返。
- 降级保护:通过版本降级检测机制,防止协议降级攻击。