SSL Session Tickets 本身无风险,隐患源于密钥长期静态不变;必须禁用 ssl_session_cache、使用48字节二进制密钥、支持多密钥轮换,并在旧版本Nginx中重启服务确保密钥生效。

ssl_session_tickets 本身不是风险源,真正隐患来自密钥长期静态不变——一旦泄露,所有历史票据可被解密重放,直接破坏前向保密(PFS)。规避关键在于主动管理密钥生命周期,而非仅开启功能。
必须禁用 ssl_session_cache
二者互斥:若同时配置,Nginx 优先走 cache,tickets 被忽略。尤其在多节点部署中,shared cache 依赖单机内存或外部存储(如 Redis),引入额外故障点和延迟;而 tickets 天然无状态,更适合集群与负载均衡。
- 确认配置中没有 ssl_session_cache 指令(包括 http 或 server 块)
- 若曾启用过,需彻底删除并 reload,否则 tickets 不生效
密钥文件必须严格合规
48 字节二进制是硬性要求,任何格式偏差都会导致票据无法加密或解密,复用率归零。
- 生成唯一可靠命令:openssl rand 48 > /etc/nginx/ticket.key.v20260707
- 验证长度:ls -l /etc/nginx/ticket.key.v20260707 输出必须为 48
- 权限设为 0400,属主为 Nginx 运行用户(如 www-data)
- 禁止用文本编辑器打开、复制、保存该文件,避免换行符或编码污染
多密钥配置与轮换不可省略
Nginx 不自动轮转,但支持最多 10 个密钥按顺序加载:首行用于加密新票据,全部行均可解密旧票据。这是实现平滑轮换与解密兼容的基础。
- 配置示例(放在 server 块内,防虚拟主机覆盖):
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260707;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260601;
ssl_session_ticket_key /etc/nginx/ticket.key.v20260501; - 每次轮换只在最前面新增一行,绝不可删旧行——否则依赖旧票据的客户端连接将失败
- 保留最近 3–4 个密钥,覆盖 OpenSSL 默认约 4 小时的 lifetime_hint,并预留重启与灰度缓冲
reload 不等于密钥实时更新
多数 Nginx 版本(≥1.19.4)支持热重载密钥,但旧版本(如 1.14–1.18)中 worker 进程启动后即缓存密钥,reload 不会重新读取文件内容。
- 验证方式:修改密钥文件后 reload,再执行 openssl s_client -connect example.com:443 -reconnect | grep "Reused",持续出现 Reused 才说明生效
- 稳妥做法:生产环境建议 systemctl restart nginx,确保新密钥完全加载
- 若用 Nginx ≥1.19.4 + njs 模块,可通过 js_set 动态注入密钥变量,实现 reload 级别更新


















