ssl session tickets 安全高效的关键在于定期轮转48字节二进制密钥,nginx不自动生成,需外部提供合规种子并按配置顺序加载,新密钥置顶、旧密钥保留用于解密,集群节点密钥一致,配合自动脚本与校验确保平滑更新。

要让 ssl_session_tickets 真正兼顾效率与安全,核心不是“开不开”,而是密钥必须定期更新、不可长期静态使用。Nginx 本身不生成或轮转密钥,所有安全性依赖外部机制提供合规的 48 字节二进制种子,并通过配置顺序和重载实现可控轮转。
生成合规的种子文件
每次更新都需全新、不可预测的随机数据,长度严格为 48 字节:
- 用
openssl rand 48 > /etc/nginx/ticket.key.v$(date +\%Y\%m\%d)生成(例如/etc/nginx/ticket.key.v20260508) - 禁止用文本编辑器打开或保存该文件——哪怕插入一个换行也会破坏二进制结构
- 用
ls -l确认大小为 48 字节,用xxd -l 16 /path/to/file查看前 16 字节是否为原始十六进制输出 - 设权限为
0400,属主为 Nginx 运行用户(如www-data或nginx)
在 Nginx 配置中声明多密钥并控制优先级
密钥按配置顺序从上到下加载,首行为当前加密密钥,其余全部用于解密旧票据:
- 配置示例(放在
http或server块内):ssl_session_tickets on;<br> ssl_session_ticket_key /etc/nginx/ticket.key.v20260508;<br> ssl_session_ticket_key /etc/nginx/ticket.key.v20260401;<br> 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字段:应为空,这是票据模式的标志(Session ID 复用会显示非空 ID) - 检查 Nginx error log 是否有
SSL_do_handshake() failed或密钥读取失败提示 - 更新密钥后,观察客户端是否仍能复用前几天建立的连接(说明旧密钥仍在列表中且有效)











