SSL Session Tickets 安全高效的关键是建立自动轮转、全节点同步、解密兼容的密钥生命周期管理:新票据用最新密钥加密,旧票据仍可被所有在线节点解密,旧密钥及时下线。

要让 SSL Session Tickets 在负载均衡集群中既高效又安全,关键不是“只配一次”,而是建立可自动轮转、全节点同步、解密兼容的密钥生命周期管理。核心目标是:新票据用最新密钥加密,旧票据仍能被所有当前在线节点解密,同时旧密钥及时下线以防长期暴露。
一、生成合规的二进制密钥文件
Session Ticket 密钥必须是严格 48 字节的二进制数据(AES 加密密钥),不能是文本、hex 或 base64。每轮新密钥都需独立生成:
- 运行
openssl rand 48 > /etc/nginx/ticket.key.$(date -d 'today' +\%Y%m%d_%H%M)生成带时间戳的密钥文件 - 确保权限为
chmod 400,仅 root 可读 - 不要重复使用同一份输出——每次轮转必须全新生成
二、配置多密钥并按顺序加载
Nginx 支持最多 3 个 ssl_session_ticket_key 指令,按配置顺序从上到下读取。第一行用于加密新票据,全部行都可用于解密入站票据:
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 在
http块中写入(路径需与实际密钥文件一致):
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ticket.key.20260501_0800;
ssl_session_ticket_key /etc/nginx/ticket.key.20260430_0800;
ssl_session_ticket_key /etc/nginx/ticket.key.20260429_0800; - 轮换时只需新增一行最上方密钥,保留最近 2–3 个(覆盖最大票据有效期,建议 ≥24 小时)
- 过期密钥(如 72 小时前的)可在确认无活跃票据后手动删除,不需修改配置
三、实现自动轮转与平滑生效
轮转无需中断连接,但必须触发 Nginx 重载配置才能识别新密钥列表:
- 用 cron 每 2–4 小时执行一次轮转脚本:生成新密钥 → 追加到配置头部 →
nginx -s reload - 注意:部分旧版 Nginx(reload 后的密钥更新支持不稳定,建议升级至 1.19.4+ 或确认 reload 行为
- 若用 njs(Nginx ≥1.19.4 + nginx-extras),可跳过配置重载,直接由 JS 动态读取密钥文件并注入
$session_tickets_key变量
四、集群节点间密钥同步与验证
所有负载均衡节点必须使用完全相同的密钥文件集合,否则客户端跨节点重连将失败(票据无法解密):
- 用 Ansible、SaltStack 或 rsync 定期同步
/etc/nginx/ticket.key.*文件到全部节点 - 验证是否生效:在任意客户端执行两次
openssl s_client -connect yourdomain.com:443 -reconnect,观察第二次是否显示Reused, TLS而非New, TLS - 检查 Nginx error 日志,确认无
SSL_do_handshake() failed或密钥读取错误

















