ssl_early_data on本身不生效,必须同时满足四重条件:Nginx≥1.15.0且编译启用SSL模块、OpenSSL≥1.1.1、server块中配置ssl_protocols TLSv1.3与会话复用机制、后端识别Early-Data头并防重放。

直接启用 ssl_early_data on 不等于获得加速,反而可能在未察觉时引入重放攻击风险。0-RTT 的“零往返”本质是复用前序会话的预共享密钥(PSK),客户端在握手初期就发送应用数据,而服务端在完成完整认证前已开始处理——这中间存在一个不可忽略的安全窗口。
必须满足的底层前提
配置生效不是写几行就完事,缺一不可:
- Nginx ≥ 1.15.0(推荐 1.19.0+),且编译时明确指定
--with-http_ssl_module --with-openssl=/path/to/openssl-1.1.1+ - OpenSSL ≥ 1.1.1(执行
openssl version验证;若显示 1.1.0 或更低,TLS 1.3 和 0-RTT 均不会启用) - 证书私钥权限正确(如
chmod 600),SELinux/AppArmor 策略未拦截 SSL 模块读取 - 运行
openssl ciphers -v 'TLSv1.3'应输出至少三条原生套件(如TLS_AES_256_GCM_SHA384),否则协商会静默降级
配置中容易被忽略的关键项
仅开启 ssl_early_data on 是危险的起点,必须配套以下设置:
-
ssl_protocols TLSv1.2 TLSv1.3:兼容旧客户端,但不能省略 TLSv1.3 -
ssl_ciphers必须只含 TLS 1.3 原生套件,例如:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256
禁用所有 TLS 1.2 专属套件(如ECDHE-RSA-AES256-SHA),它们会干扰协商 - 启用会话票据:
ssl_session_tickets on;+ssl_session_timeout 1d;+ssl_session_ticket_key /etc/nginx/ticket.key;(密钥需用openssl rand 80 > ticket.key生成并设为 400 权限) - 显式透传标识:
proxy_set_header Early-Data $ssl_early_data;,否则后端无法识别 0-RTT 请求
后端必须承担的安全责任
Nginx 不校验、不拦截、不防重放,它只负责把 Early-Data: 1 头和原始请求一起转发。真正的防护全在后端:
- 收到
Early-Data: 1时,立即拒绝所有非幂等方法(POST/PUT/DELETE),或返回425 Too Early引导客户端降级重发 - 对允许的
GET类请求,也需校验时间窗口(如请求时间距 PSK 签发 ≤ 24 小时)、nonce 值或一次性 token - 涉及用户状态变更的操作(如登录、下单、修改资料),不能仅依赖 TLS 层标识,必须二次校验 session、token 有效性或业务层幂等键
- 建议在 Nginx location 块内用
limit_except GET HEAD { deny all; }做第一道协议层过滤
哪些场景该关掉 0-RTT
它不是通用加速器,而是有明确适用边界的特性:
- 用户频繁清理浏览器缓存或跨设备访问 → PSK 失效,0-RTT 从不触发
- CDN、WAF 或中间代理不支持 TLS 1.3 early_data 扩展 → 握手强制退化为 1-RTT
- 登录页、支付接口、表单提交路径 → 强烈建议禁用,或仅对静态资源路径(如
/static/、/api/v1/public)启用 - 局域网或低延迟环境(RTT











