TLS 1.3 握手协议相比 1.2 的改进
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 握手流程分割为三个加密阶段:
- 初始阶段:
ClientHello和ServerHello后的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_sha256、ecdsa_secp256r1_sha256)。 - 服务器选择并明确通过
CertificateVerify消息中的signature_scheme字段指示所用算法。 协商路径直接且强制,避免了降级攻击,并统一使用了哈希+签名格式。
6. 握手状态机极简化
TLS 1.2 的状态机复杂,包含多种重复性的飞行消息和多种可选消息。TLS 1.3 删除了大量冗余内容:
- 删除
ServerKeyExchange:密钥分享参数直接包含在ServerHello扩展中。 - 删除
ChangeCipherSpec(如前所述)。 - 合并
ServerHello和EncryptedExtensions,形成紧凑的响应。 最终握手简化为几个固定的线性步骤,实现更简单,漏洞表面大幅缩小。
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 也只需极简的配置,即可默认享受这些安全优势。