前言
TLS 1.3 是传输层安全协议的最新版本,相比 TLS 1.2,它在安全性和性能上都有显著提升。本文聚焦 TLS 1.3 的握手过程,解析其工作原理。
TLS 1.3 握手流程
TLS 1.3 将握手过程简化为 1-RTT(单次往返),流程如下:
|
|
1. ClientHello
客户端发送第一条消息,包含:
- 支持的 TLS 版本:指示支持 TLS 1.3
- 密码套件列表:如
TLS_AES_128_GCM_SHA256 - key_share 扩展:包含 Diffie-Hellman 公钥(用于密钥交换)
- signature_algorithms:支持的签名算法列表
|
|
2. ServerHello
服务器响应:
- 选择的 TLS 版本:确认使用 TLS 1.3
- 选择的密码套件:从客户端列表中选择
- key_share:服务器的 DH 公钥
|
|
3. 加密扩展(EncryptedExtensions)
此时双方已建立共享密钥,后续消息全部加密传输:
- 服务器发送
EncryptedExtensions,包含非加密敏感的扩展参数
4. 证书与验证
- Certificate:服务器证书链
- CertificateVerify:服务器用私钥对握手消息签名,证明拥有证书
5. Finished
双方发送 Finished 消息,包含对整个握手的 HMAC 校验,确保握手未被篡改。
与 TLS 1.2 的对比
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 握手往返次数 | 2-RTT | 1-RTT |
| 支持的算法 | RSA、DH、ECDH、弱密码套件 | 仅 ECDH、强密码套件 |
| 证书验证 | 明文传输 | 加密传输 |
| 会话恢复 | Session ID / Session Ticket | PSK / 0-RTT |
| 不安全算法 | RC4、SHA-1、RSA 密钥交换 | 全部移除 |
密码套件格式
TLS 1.3 密码套件命名格式:
|
|
示例:
TLS_AES_128_GCM_SHA256TLS_AES_256_GCM_SHA384TLS_CHACHA20_POLY1305_SHA256
注意:TLS 1.3 不再在密码套件中指定密钥交换算法,因为强制使用 ECDH。
使用 OpenSSL 测试 TLS 1.3
|
|
实际输出示例:
|
|
总结
TLS 1.3 通过以下改进提升了安全性和性能:
- 简化握手:1-RTT 减少延迟
- 移除弱算法:不再支持 RSA 密钥交换、RC4、SHA-1
- 加密证书:证书链在加密通道中传输
- 前向保密:强制使用临时 DH 密钥交换