术语表

会话恢复 (Session Resumption)

最后核实

定义

会话恢复是 TLS 的一种机制,客户端重连时复用先前会话的密钥材料,跳过完整的密钥交换和证书验证。

会话恢复指客户端在最近和服务器完成过一次完整 TLS 握手 后,下次连接直接复用那次会话的秘密,不必重新做密钥交换和证书认证。TLS 1.2 有两种方式:Session ID(状态保存在服务器缓存里)和 Session Ticket(服务器把加密后的状态交给客户端保管)。TLS 1.3 把两者统一为基于 PSK 的机制,通过 NewSessionTicket 消息下发。

为什么重要

恢复握手不需要证书签名,服务器省 CPU,客户端也更快;在 TLS 1.3 中它还是 0-RTT 的前提。安全上的取舍在于保存的状态如何保护:TLS 1.2 下,谁拿到服务器的 ticket 密钥或会话缓存,就能解密相应会话,削弱了前向保密。TLS 1.3 的 psk_dhe_ke 模式在恢复时会再做一次 ECDHE,恢复后的连接仍有前向保密。多台服务器做负载均衡时,需要共享会话缓存或 ticket 密钥,否则客户端落到另一台机器上就只能重新完整握手。

例子

Nginx 常见的会话缓存配置:

ssl_session_cache   shared:SSL:10m;   # 按 nginx 文档,1MB 约可存 4000 个会话
ssl_session_timeout 1d;

用 TLS 1.2 验证恢复是否生效(OpenSSL 会用同一会话重连五次):

openssl s_client -connect example.com:443 -servername example.com -tls1_2 -reconnect </dev/null 2>/dev/null | grep -E '^(New|Reused)'

常见误区

  • 恢复跳过了认证,所以不安全。 恢复的会话在密码学上绑定于原先经过完整认证的会话,服务器无需再次证明身份。
  • 会话恢复就是 0-RTT。 普通恢复仍需一个往返,0-RTT 是在此基础上可选的提前发送数据。
  • 关掉 Session Ticket 就没有会话恢复了。 视 TLS 库而定,服务器端会话缓存仍可提供恢复。

延伸阅读