会话恢复是什么
会话恢复让客户端再次连接时跳过完整的密钥交换与证书验证,直接沿用一个已协商好的安全上下文。传统上有两种机制:Session ID 由服务端保存会话状态,Session Ticket(RFC 5077)把加密后的状态交给客户端自己持有。TLS 1.3 统一为 PSK 恢复模式,用服务端下发的票据配合早期导出密钥重建会话。
基本信息
| Session ID | 服务端内存或共享缓存保存会话状态 |
|---|---|
| Session Ticket | 状态加密后由客户端持有(RFC 5077) |
| TLS 1.3 | 基于 PSK 与早期导出密钥 |
| 安全要求 | 票据密钥需定期轮换,否则前向保密被削弱 |
| 兼容性 | 不同客户端支持的机制可能不同 |
| 收益 | 减少握手往返与 CPU 开销,降低首字节延迟 |
典型使用场景
- 高并发站点降低握手开销:短连接场景下恢复能明显省下 CPU 与延迟
- 多节点共享会话缓存:让客户端无论落到哪台机器都能成功恢复
- 排查「时快时慢」:客户端命中不同节点导致恢复失败是常见原因
- 安全加固评审:确认票据密钥轮换策略与前向保密的取舍
nginx 会话缓存配置
nginx 会话缓存配置
ssl_session_cache shared:SSL:10m; # 共享内存缓存,10 MB 约存 4 万个会话
ssl_session_timeout 1d; # 会话有效期,按业务特点调整
ssl_session_tickets off; # 关闭票据,或开启后配合密钥轮换
# 验证恢复是否真的生效:观察两次握手中是否有 Reused
# echo | openssl s_client -connect example.com:443 -servername example.com -reconnect 2>&1 | grep -iE 'Reused|New'两种机制对照
| 维度 | Session ID | Session Ticket |
|---|---|---|
| 状态存放 | 服务端 | 客户端 |
| 多节点要求 | 需要共享缓存 | 需要共享票据密钥 |
| 主要风险 | 缓存被撑满或状态不同步 | 票据密钥泄露可解密相关会话 |
| 前向保密 | 相对较好 | 依赖密钥轮换策略 |
会话恢复能明显降低握手开销,但票据密钥泄露会让攻击者解密相关会话,轮换策略要与保护等级匹配。
多节点布局很关键:票据模式要保证各节点使用同一份票据密钥并同步轮换,否则客户端在不同节点间跳转时会反复恢复失败。
恢复不等于无风险:TLS 1.3 的 PSK 恢复仍会校验票据完整性,但 0-RTT 早期数据可被重放,涉及写操作的请求不应接受 0-RTT。