安全稳定复用 SSL session tickets 的关键是使用 Nginx 支持的多密钥轮换机制:生成严格 48 字节二进制种子文件,按优先级顺序配置多个密钥,新密钥置首、旧密钥保留至少 24 小时以解密旧票据,配合较短 ssl_session_timeout(如 10m)降低内存风险。

要让 ssl_session_tickets 既安全又稳定复用,关键不是“固定一个密钥长期用”,而是用一组受控轮换的二进制种子文件,让新票据加密用最新密钥、旧票据解密仍可用历史密钥——这正是 Nginx 原生支持的多密钥机制。
生成合规的种子文件(48 字节二进制)
每个密钥文件必须是严格的 48 字节原始二进制,用于 AES-128-CBC 加密 + HMAC-SHA256 验证。不能是文本、hex 或 base64。
- 用 OpenSSL 一次性生成:
openssl rand 48 > /etc/nginx/ticket.key.v20260506 - 验证长度是否准确:
ls -l /etc/nginx/ticket.key.v20260506应显示 48 - 禁止用编辑器打开或保存,避免换行/编码污染;可用
xxd或hexdump -C确认内容为纯二进制
在配置中按优先级顺序加载多个种子
Nginx 按配置出现顺序使用密钥:第一行用于加密新票据,所有行都可用于解密入站票据。最多支持 10 个,推荐保留最近 2–3 个。
- 示例配置(放在
http或server块中):
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260506;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260401;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260301;
- 每次轮换只需把新密钥加在最前面,不删旧的——确保客户端携带的旧票据还能被解密
- 密钥保留时间应 ≥ 最大票据有效期(默认约 4 小时),建议至少保留 24 小时,覆盖滚动发布与意外重启
配合 ssl\_session\_timeout 控制内存缓存节奏
ssl_session_timeout 管的是内存中 session cache 的存活时间,不影响票据本身有效期,但它影响整体复用策略的协同性。
- 设为较短值(如
10m或30m),降低共享内存区压力和泄露风险 - 真正决定票据能否复用的是客户端本地存储 + 服务端密钥是否仍在列表中,而非这个 timeout
- 不要把它和票据有效期混淆:Nginx 不直接设置 lifetime_hint,该提示由密钥轮换节奏间接约束
自动化轮换与安全落地要点
没有内置自动调度,但可通过 cron + 脚本可靠实现,重点在于原子性与容错。
- 每月初或每 7 天执行一次脚本:生成新密钥 → 插入配置最前 →
nginx -s reload - 脚本中加入校验:检查新密钥文件存在、长度为 48、权限为 600、Nginx 用户可读
- 集群部署时,所有节点必须同步同一组密钥文件——用 Ansible、rsync 或配置中心统一下发
- 禁用
ssl_session_cache过大配置(如100m),它和票据是互补关系,不是替代;建议按实际新建会话量计算,起步shared:SSL:10m即可


















