Apache SSL会话无法复用的根源是配置位置错误、机制混用、ticket.key失效或验证缺失;需全局配置SSLSessionCache与SSLSessionTickets,确保密钥48字节统一、权限600,并用openssl命令验证Reused状态。

Apache 中 SSL 会话无法复用,不是“没开开关”,而是配置位置错、机制混用、密钥失效或验证缺失导致的隐性故障。真正生效的关键,在于全局协同、单点控制和终端验证。
必须在全局配置中启用 SSLSessionCache
SSLSessionCache 是进程间共享缓存的核心指令,只允许出现在主配置文件顶层(如 /etc/apache2/mods-enabled/ssl.conf 或 /etc/httpd/conf.d/ssl.conf),不能写在 块里——否则 Apache 启动直接报错或静默忽略。
- 正确写法示例:
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000) - 路径需真实存在,且 Apache 运行用户(如
www-data)有读写权限 - 括号内数值单位为字节,中小站点建议 512000(约 500KB);高并发可增至 2097152(2MB)
- 配套必须设置:
SSLSessionCacheTimeout 300(5 分钟,匹配主流客户端行为)
SSLSessionTickets 必须全局开启且密钥严格一致
会话票据(Session Ticket)是移动端和跨服务器复用的关键,但它不支持 VirtualHost 级别配置,也极易因密钥问题彻底失效。
- 在同一个全局配置文件中添加:
SSLSessionTickets on和SSLSessionTicketKeyFile /etc/ssl/private/ticket.key -
ticket.key必须是恰好 48 字节的二进制文件(openssl rand 48 > ticket.key),不可 base64 编码 - 权限必须为
600,属主为 Apache 运行用户;多节点部署时,所有机器必须使用完全相同的ticket.key文件(校验sha256sum) - 注意:2.4.8+ 版本默认开启
SSLSessionTickets,但重启后密钥丢失,实际等效于关闭
避免机制冲突与覆盖失效
SSLSessionCache(服务端有状态缓存)和 SSLSessionTickets(客户端无状态票据)逻辑不同,混用或误覆盖会导致复用行为异常。
- 确认未在任何子配置(如 .htaccess、某 VirtualHost 内)写
SSLSessionTickets off覆盖全局设置 - 若已启用票据机制,建议显式关闭共享缓存冲突项:
SSLSessionCache none(或至少不用shared:类型) - 协议与套件必须兼容票据:禁用老协议
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1,保留 TLS_AES_*(TLS 1.3)和 ECDHE 套件
用终端命令验证是否真复用成功
配置写对 ≠ 实际生效。仅靠日志或 reload 状态无法确认,必须通过 OpenSSL 客户端实测。
- 首次连接:
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep "New, TLS"→ 应输出New - 二次连接:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Reused"→ 应输出Reused, TLSv1.3 - 同时检查
server-status?auto页面:确认cache type: SHMCB且hits > misses - 若显示
Session-ID: xxx且无Reused,说明仍走旧缓存路径,票据未生效











