# 会话恢复（Session Resumption）是什么？

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

Source: https://ssl.sh/zh/glossary/session-resumption/
Last updated: 2026-11-10

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

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

## 例子
Nginx 常见的会话缓存配置：

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

用 TLS 1.2 验证恢复是否生效（OpenSSL 会用同一会话重连五次）：

```bash
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 库而定，服务器端会话缓存仍可提供恢复。

## 相关术语

- [Session Ticket](https://ssl.sh/zh/glossary/session-ticket/): Session Ticket 是服务器交给客户端保管的加密会话状态，客户端下次连接时出示它即可恢复会话，服务器无需保存任何状态。
- [PSK](https://ssl.sh/zh/glossary/psk/): PSK（预共享密钥）是 TLS 双方在握手前就已共同持有的秘密，用于会话恢复，或在不使用证书的情况下完成身份认证。
- [0-RTT](https://ssl.sh/zh/glossary/0-rtt/): 0-RTT 是 TLS 1.3 和 QUIC 的特性，允许回访的客户端用上一次会话留下的密钥，在第一个数据包里就发送应用数据。
- [TLS 握手](https://ssl.sh/zh/glossary/tls-handshake/): TLS 握手是 TLS 连接开始时的一组消息交换，客户端与服务器在其中协商协议版本和密码套件、验证服务器身份并派生会话密钥。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
