SSL会话票据安全复用的关键是密钥必须定期轮转而非静态不变;需用openssl rand生成48字节二进制密钥文件,Nginx配置中按优先级顺序声明多密钥(最新置顶),并通过脚本自动轮转+校验+重载。

要让 ssl_session_tickets 既高效复用又真正安全,关键不在“开不开”,而在于**密钥不能静态不变**。Nginx 本身不生成或轮转密钥,必须靠外部机制提供合规的 48 字节二进制种子文件,并通过配置顺序和 reload 实现准自动轮转。
生成合规的密钥种子文件
每次轮转都必须使用全新、不可预测的随机二进制数据,长度严格为 48 字节:
- 用
openssl rand 48 > /etc/nginx/ticket.key.v20260501生成(日期后缀便于识别) - 禁止用文本编辑器打开或修改该文件——哪怕只加一个空格也会破坏二进制结构
- 用
ls -l和xxd -l 16 /etc/nginx/ticket.key.v20260501验证大小与内容是否为原始二进制 - 权限设为
0400,属主为 nginx 运行用户(如www-data)
在 Nginx 配置中声明多密钥并控制优先级
密钥按配置顺序从上到下加载,首行为当前加密密钥,其余全部用于解密旧票据:
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 把最新密钥放在最前面:
ssl_session_ticket_key /etc/nginx/ticket.key.v20260501; - 紧随其后保留最近 2–3 个旧密钥(覆盖票据最大生命周期,通常 4–72 小时足够):
ssl_session_ticket_key /etc/nginx/ticket.key.v20260401;、ssl_session_ticket_key /etc/nginx/ticket.key.v20260301; - 确保所有节点(分布式集群)使用完全相同的密钥文件路径与内容
- 不要删除旧密钥行,也不要替换已有文件——新增密钥必须追加并置顶
实现定期自动轮转的最小可行脚本
借助 cron + shell 脚本,可每月或每几小时触发一次安全轮转:
- 用
0 2 1 * * root /usr/local/bin/rotate-ticket-key.sh设置每月 1 日凌晨 2 点执行 - 脚本内先生成新密钥文件,再用
sed -i '1i\ssl_session_ticket_key /etc/nginx/ticket.key.v'"$(date +\%Y\%m\%d)"';' /etc/nginx/conf.d/ssl.conf插入首行 - 加入校验:检查新密钥是否为 48 字节、文件是否存在、nginx 配置语法是否正确(
nginx -t) - 仅当全部校验通过后才执行
nginx -s reload;失败则发告警,不中断服务
验证票据是否生效且轮转正常
光配对不等于跑通,需端到端确认:
- 用
openssl s_client -connect example.com:443 -servername example.com -reconnect 2>/dev/null | grep "Reused, TLS"查看是否复用 - 对比两次连接的
Session-ID字段:应为空,这是票据模式的标志 - 检查 Nginx error log 是否有
SSL_do_handshake() failed或密钥读取失败提示 - 轮转后观察客户端是否仍能复用前几天建立的连接(说明旧密钥仍在列表中且有效)










