Plainnotes

TLS 1.3 的 0-RTT,快但能重放

2024-03-23 · 3 分钟网络

TLS 1.3 的 0-RTT 允许客户端在第一个往返里就带上应用数据,省一个 RTT。代价是这些数据可以被攻击者截获后重放——服务端无法区分“新请求”和“重放的旧请求”。

所以只适合幂等操作:GET、静态资源。任何会改变状态的操作(下单、扣款、发消息)都不该走 0-RTT。

nginx 里默认不开,开了要显式:

ssl_early_data on;

配套要在应用层拒绝非幂等方法:

if ($request_method !~ ^(GET|HEAD)$) {
    return 425;
}

425 Too Early 就是为这个场景定义的。多数站点根本不需要 0-RTT,省的那点延迟不值得引入重放风险。