必须显式配置稳定的SSLSessionTicketKeyFile,否则Apache重启后票据失效,移动端重连被迫执行完整TLS握手;因2.4.8+默认开启但密钥随机生成,服务端无法解密旧票据,导致会话复用失败。
必须显式配置稳定的 SSLSessionTicketKeyFile,否则重启 Apache 后票据全部失效,移动端重连仍走完整 TLS 握手。
为什么默认开启却没效果
Apache 2.4.8+ 默认启用 SSLSessionTickets on,但密钥由 OpenSSL 运行时随机生成,每次 Apache 重启都会变。客户端带着旧票据来,服务端解不开,只能降级为全握手——这在移动端频繁切换 Wi-Fi/蜂窝网络时尤为明显。
-
SSLSessionTickets本身不存状态,只负责加解密;真正的“复用”依赖密钥长期一致 - 移动端浏览器(Chrome for Android、Safari、WKWebView、OkHttp)默认支持 TLS 1.2+ session ticket,但前提是服务端能解密
- 如果用
.htaccess或某虚拟主机里写了SSLSessionTickets off,会覆盖全局配置,导致该站点完全不发票据
如何生成并加载有效的 ticket.key
密钥必须是 48 字节原始二进制,不可 base64、不可 hex、不可写进配置文件。
Codenull.ai
一个无代码AI平台,允许用户无需编写一行代码就可以构建任何AI模型。
下载
- 首次生成:
openssl rand -out /etc/ssl/private/ticket.key 48 - 设权限:
chmod 600 /etc/ssl/private/ticket.key && chown www-data:www-data /etc/ssl/private/ticket.key(用户按实际运行身份调整) - 在
ssl.conf或主配置中添加:SSLSessionTicketKeyFile /etc/ssl/private/ticket.key - 多机集群时,所有节点必须用完全相同的文件内容——建议通过 Ansible 或配置中心统一下发,而非本地生成
常见失效场景与验证方式
配置后没提速?先看这三个地方断没断:
- 抓包确认
ClientHello有session_ticket扩展,但ServerHello没返回NewSessionTicket→ 检查是否被子配置关闭,或SSLProtocol禁用了 TLS 1.2+(如残留-TLSv1.1却漏了-TLSv1.2) - DevTools → Security 显示 “Connection: secure (obsolete TLS version)” → 客户端强制走 TLS 1.0/1.1,票据机制根本不触发
- 单机 OK,上线后移动端慢 → 负载均衡器(如 Nginx 做 TLS 终结)截断了
session_ticket扩展,需开启透传或改由 LB 统一管理票据 - 验证是否生效:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID",若第二行出现Reused, TLSv1.3即成功
最易被忽略的一点:ticket 密钥一旦写入生产环境,就不能再换——除非接受所有存量移动端用户下次连接都退化为全握手。轮换需配合灰度发布与客户端版本控制。