在CDN加速HTTPS业务时,TLS握手带来的延迟常常被忽略。一次完整的TLS 1.2握手需要两次网络往返,在跨地域访问下可能多出上百毫秒。TLS会话票据(Session Tickets)通过将会话密钥加密后交给客户端保存,使得后续连接可以跳过密钥协商,直接恢复加密通道。这种机制如果配置得当,服务端不需要在内存里记录任何会话状态,也就是所谓的无状态恢复。

什么是TLS会话票据
TLS会话票据是RFC 5077定义的一种会话恢复方法。服务器在握手完成后,把会话主密钥、加密套件、有效期等信息打包,用只有自己知道的密钥加密,生成一段二进制数据发给浏览器。浏览器把它存下来,下次建连时在ClientHello里带上这个票据。服务器用本地密钥解密校验,确认无误就直接复用原会话,不再做证书校验和密钥交换。
和早期的会话ID不同,会话ID要求服务端把会话存进内存或共享缓存,属于有状态恢复。当流量分散到成百上千个CDN边缘节点时,用户第二次访问很可能落到另一个节点,内存里没有记录,恢复就失败了。票据把状态交给客户端携带,服务端只要持有同一把加密密钥就能解密,天然适合分布式无状态场景。
无状态恢复的核心配置要点
实现无状态恢复的第一个关键是票据加密密钥的统一与稳定。CDN边缘节点必须能互相解密彼此发出的票据,因此不能每个节点自己随机生成密钥。运维上通常会配置一组全局一致的密钥,所有边缘机器从配置中心拉取同一份密钥列表。这样用户在A节点拿到票据,到B节点也能顺利恢复。
第二个关键是密钥轮换不能太频繁。票据里包含有效期,一般设为1到7天。如果每天换一把新密钥且立刻废弃旧密钥,大量存量票据会失效,恢复率跳水。正确做法是维护一个密钥环:新密钥加入,旧密钥保留一段时间并行可用,过了最大票据寿命再删除。下表给出典型配置参考。
| 配置项 | 推荐值 | 说明 |
|---|---|---|
| 票据有效期 | 24至72小时 | 过长增加密钥泄露风险,过短降低恢复率 |
| 密钥环长度 | 2至3把 | 一把在用,其余为旧密钥待退场 |
| 单密钥最长使用 | 不超过7天 | 满足前向安全的一般要求 |
| 边缘节点同步 | 秒级一致 | 避免新节点无密钥导致恢复失败 |
具体配置示例思路
以常见CDN使用的Nginx加openssl体系为例,配置指令ssl_session_tickets on开启票据,ssl_session_ticket_key指向一个所有节点相同的文件。该文件可放两到三行,每行对应一把密钥,首行是新密钥。更新时先把新密钥追加到首行,观察一周期后再移除末尾旧行。这种操作保证了轮换期内的向后兼容。
如果使用的是云CDN控制台,通常会有会话复用或TLS票据开关,以及票据密钥版本管理。管理员应当关闭自动每日轮换,改为手动或低频按计划轮换,并且确认多区域边缘都绑定同一密钥版本。切忌在流量高峰随意点重置,否则瞬间恢复率掉到零。
常见误区与排查
误区一是把票据和TLS 1.3的0-RTT混为一谈。0-RTT依赖票据但额外允许早期数据,配置不当会重放攻击。无状态恢复只要普通票据恢复即可,不必开启0-RTT。误区二是认为浏览器会永久存票据,实际上关浏览器或超期就清掉,所以服务端密钥保留时间应大于客户端平均访问间隔。
排查恢复率低时,可用openssl s_client连续两次连接同一CDN域名,看第二次是否出现Reused会话提示。若未复用,检查边缘节点密钥是否一致、有效期是否过短、以及中间是否有代理剥离了SessionTicket扩展。通过抓包确认ClientHello带Ticket而ServerHello未拒绝,就能定位是哪一层配置断裂。
总结建议
CDN的TLS会话票据是实现无状态恢复的高效手段,核心在于全局统一且平缓轮换的密钥管理。中小站点可直接使用云厂商默认保守配置,大型分布式业务应自建密钥下发通道,监控各节点恢复率指标。把恢复率维持在八成以上,用户感知的HTTPS打开速度会有明显提升。