首页/安全/加密与证书速查/TLS 1.3 0-RTT 与会话重放风险
TLS 与 HTTPS60 条

TLS 1.3 0-RTT 与会话重放风险

0-RTT 允许客户端在首个飞行就发送应用数据(early data),降低延迟;但早数据可被重放,只适合幂等请求。

加密与证书速查安全更新于 2026-10-13

0-RTT 是什么

0-RTT 是 TLS 1.3 的早期数据机制:客户端在会话恢复时把应用数据放进第一个飞行,与握手同时发出,从而省掉一个往返。代价是这些早数据不具备抗重放能力,攻击者可以截获并重复发送。因此它只适合幂等请求,比如读取类接口;涉及下单、扣款等写操作应当拒绝或降级处理,这一判断必须由后端完成。

基本信息

前提基于 PSK 会话恢复
风险early data 可被攻击者重放
适用范围GET 等幂等请求
服务端控制Nginx 的 ssl_early_data 与 Early-Data 头
后端处置对带 Early-Data 头的请求拒绝非幂等操作
观测影响早数据被拒绝时客户端会重试,压测数据可能失真

典型使用场景

  • 移动端首屏优化:读取类接口用 0-RTT 降低首次请求延迟
  • 静态资源与查询接口:天然幂等,适合开启早数据
  • 写操作防护:下单、支付类接口明确拒绝早数据请求
  • 压测与容量评估:区分早数据请求与被拒绝后的重试,避免结论失真
  • 安全评审:确认会话票据是否做了单次使用约束

nginx 开启 0-RTT 并标记请求

nginx 开启 0-RTT 并标记请求
ssl_early_data on;
proxy_set_header Early-Data $ssl_early_data;   # 供后端识别早数据请求
# 后端对带该头的非幂等请求应直接拒绝或要求重试
# 测试时可观察握手是否走了 0-RTT:s_client 提供早数据相关选项

风险与缓解

风险说明缓解
重放早数据可被重复发送只允许幂等请求
票据滥用票据未做单次约束时窗口更大轮换票据密钥,敏感接口关闭 0-RTT
统计失真被拒绝的请求会自动重试压测与监控区分两类请求
中间设备兼容部分设备处理早数据异常上线前逐跳验证
后端若对带 Early-Data 头的请求执行非幂等操作(下单、扣款),必须自行拒绝或降级处理。
0-RTT 并不等于「更快的 TLS」:它只在会话恢复且客户端愿意发送早数据时生效,首次访问没有任何收益。
关闭 0-RTT 只是不接受早数据,不影响正常的会话恢复,因此性能回归通常很小,敏感业务不必勉强开启。

易错点

  • 开启 0-RTT 后压测数据可能失真(部分请求被后端拒绝),需区分统计
  • 会话票据未做单次使用约束时,重放窗口更大,敏感接口建议关闭 0-RTT
  • 把 0-RTT 当成普适加速手段:首次访问与不支持早数据的客户端都没有收益
  • 只在前端开启而不在后端做幂等判断,重放风险直接落到业务上
  • 忽略中间设备对 early data 的处理差异,导致部分链路异常

数据来源与参考

  • RFC 8446 §8(0-RTT 与反重放)
  • nginx 官方文档 ssl_early_data
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌