Código de status HTTP · Erros do cliente (4xx)
Erro 425 Too Early
O erro 425 Too Early significa que o servidor não vai processar um pedido que chegou em early data (0-RTT) do TLS 1.3, porque um atacante poderia repeti-lo. Acontece quando uma conexão retomada manda um pedido não idempotente, como um POST de pagamento, antes do handshake terminar.
| Classe | 4xx, Erros do cliente |
|---|---|
| Definido em | RFC 8470 §5.2 |
| Pode ir para o cache por padrão | Só com Cache-Control ou Expires explícitos; a RFC 8470 diz que não é cacheável por padrão |
| Pode repetir o pedido | Sim, automaticamente, depois que o handshake TLS terminar e nunca mais como early data |
| Cabeçalhos relevantes |
|
O que significa o 425
O TLS 1.3 permite que um cliente que já conectou antes mande o primeiro pedido junto com o handshake, economizando uma ida e volta. Esse early data não tem proteção contra replay: quem capturou pode enviá-lo de novo. A RFC 8470 define o 425 para o servidor, ou a origem atrás de uma CDN, dizer "early data não" para pedidos em que uma repetição causaria estrago.
Um proxy que aceita 0-RTT adiciona Early-Data: 1 ao repassar esse tipo de pedido e precisa devolver o 425 ao cliente sem mexer. O cliente deve repetir o pedido sozinho depois do handshake, então o usuário normalmente nem vê o 425; os navegadores já mandam só pedidos idempotentes, como GET, em early data.
Causas comuns
Se você administra o servidor
- 0-RTT ligado na borda (ssl_early_data on no nginx, ou uma opção da CDN) e a origem recusando pedidos que alteram estado com Early-Data: 1.
- Uma biblioteca HTTP enviando POST em early data, que a maioria dos servidores que seguem a RFC 8470 recusa.
Como resolver
Se você administra o servidor
- Deixe o cliente repetir: um cliente que segue a RFC reenvia depois do handshake e a segunda tentativa funciona.
- Só recuse quando houver risco real de replay: métodos seguros (GET, HEAD) sem efeitos colaterais podem ser atendidos em early data.
- Se um cliente próprio continua falhando, desligue o 0-RTT nele; o custo é uma ida e volta a mais nas conexões retomadas.
Como enviar um 425
app.post('/payments', (req, res) => {
if (req.get('Early-Data') === '1') {
return res.status(425).json({ error: 'Retry after the TLS handshake completes' });
}
// ... charge the card
});// app/payments/route.ts
export async function POST(request: Request) {
if (request.headers.get('early-data') === '1') {
return Response.json({ error: 'Retry after the TLS handshake completes' }, { status: 425 });
}
// ... charge the card
}mux.HandleFunc("POST /payments", func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("Early-Data") == "1" {
http.Error(w, "retry after the TLS handshake completes", http.StatusTooEarly) // 425
return
}
// ... charge the card
})from fastapi import FastAPI, HTTPException, Request
app = FastAPI()
@app.post("/payments")
def create_payment(request: Request):
if request.headers.get("early-data") == "1":
raise HTTPException(status_code=425, detail="Retry after the TLS handshake completes")
# ... charge the card# Accept 0-RTT at the edge, tell the app which requests came in early data
ssl_early_data on;
location / {
proxy_set_header Early-Data $ssl_early_data;
proxy_pass http://app;
}
# The app answers 425 to unsafe requests with Early-Data: 1Costuma ser confundido com
- 425 vs 429
- O 429 diz que você mandou pedidos demais e precisa esperar; o 425 diz que este pedido chegou cedo demais na conexão e pode ser repetido logo em seguida.
- 425 vs 426
- O 426 pede para o cliente trocar de protocolo; o 425 mantém o protocolo e só pede para esperar o handshake TLS.
Perguntas frequentes
- O que é early data (0-RTT) no TLS 1.3?
- Um recurso que permite ao cliente que está retomando uma sessão mandar dados da aplicação já no primeiro envio, antes do handshake terminar. Economiza uma ida e volta, mas não protege contra replay, por isso os servidores recusam pedidos arriscados nele com 425.
- O navegador vai me mostrar um erro 425?
- Quase nunca. O navegador só coloca pedidos seguros em early data e, se o servidor responder 425, ele repete o pedido depois do handshake sem mostrar nada.
- Quais pedidos devem receber 425?
- Pedidos que mudam estado e causariam dano se processados duas vezes, como pagamentos, pedidos de compra ou troca de senha, quando chegam com Early-Data: 1 ou direto em early data. A RFC 8470 manda não usar 425 fora disso, porque o cliente pode não ter como repetir.
Revisado em por Arielton Oberek.