# Session Ticket（会话票据）是什么？

> Session Ticket 是服务器交给客户端保管的加密会话状态，客户端下次连接时出示它即可恢复会话，服务器无需保存任何状态。

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

Session Ticket 最早由 [RFC 5077](https://www.rfc-editor.org/rfc/rfc5077) 为 TLS 1.2 引入：握手结束后，服务器用只有自己知道的对称密钥（STEK，ticket 加密密钥）加密包括主密钥在内的会话状态，发给客户端；客户端重连时出示 ticket，服务器解密后即可恢复。TLS 1.3 沿用了这个名字：握手后服务器发送 NewSessionTicket 消息，每个 ticket 对应一个用于[会话恢复](https://ssl.sh/zh/glossary/session-resumption/)的 [PSK](https://ssl.sh/zh/glossary/psk/)。

## 为什么重要
有了 ticket，大规模集群不需要共享会话缓存，只要每台服务器持有同一个 STEK 就能互相恢复会话。但 STEK 也正是薄弱环节：在 TLS 1.2 中，拿到 STEK 的人可以解密所有用它保护过 ticket 的历史会话，[前向保密](https://ssl.sh/zh/glossary/forward-secrecy/)因此打了折扣。所以 ticket 密钥必须随机生成、不进备份和日志、安全分发并频繁轮换。如果无法保证轮换，一些加固指南建议对 TLS 1.2 关闭 ticket。

## 例子
```bash
openssl rand 80 > /etc/nginx/ticket.key   # nginx 接受 80 或 48 字节的密钥文件
chmod 600 /etc/nginx/ticket.key
```

```nginx
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.current.key;   # 用于加密新 ticket
ssl_session_ticket_key /etc/nginx/ticket.previous.key;  # 仍可用于解密
```

配置多个密钥时，Nginx 只用第一个加密新 ticket，其余只用于解密，便于平滑轮换。

## 常见误区
- **ticket 是用证书私钥加密的。** 不是，用的是单独的对称密钥，与证书私钥无关。
- **续签证书会顺带轮换 ticket 密钥。** 两者互不相关。证书换了多少次，长期不变的 STEK 依然有效，必须自己安排轮换。
- **TLS 1.3 的 ticket 也有同样的前向保密问题。** 使用 psk_dhe_ke 模式时，TLS 1.3 恢复会再做一次 ECDHE，泄露 ticket 密钥只会暴露 0-RTT 数据。

## 相关术语

- [会话恢复](https://ssl.sh/zh/glossary/session-resumption/): 会话恢复是 TLS 的一种机制，客户端重连时复用先前会话的密钥材料，跳过完整的密钥交换和证书验证。
- [PSK](https://ssl.sh/zh/glossary/psk/): PSK（预共享密钥）是 TLS 双方在握手前就已共同持有的秘密，用于会话恢复，或在不使用证书的情况下完成身份认证。
- [前向保密](https://ssl.sh/zh/glossary/forward-secrecy/): 前向保密是密钥交换的一种安全属性：即使服务器的长期私钥日后泄露，过去连接的会话密钥也不会因此暴露。
- [0-RTT](https://ssl.sh/zh/glossary/0-rtt/): 0-RTT 是 TLS 1.3 和 QUIC 的特性，允许回访的客户端用上一次会话留下的密钥，在第一个数据包里就发送应用数据。
- [密钥轮换](https://ssl.sh/zh/glossary/key-rotation/): 密钥轮换是按计划或在安全事件后，用新生成的密钥替换旧密钥，以限制密钥泄露造成损失的做法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
