Skip to content

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.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 8470 §5.2
Pode ir para o cache por padrãoSó com Cache-Control ou Expires explícitos; a RFC 8470 diz que não é cacheável por padrão
Pode repetir o pedidoSim, automaticamente, depois que o handshake TLS terminar e nunca mais como early data
Cabeçalhos relevantes
  • Early-Data: enviado com valor 1 por um proxy ou CDN que repassa um pedido recebido em early data do TLS 1.3

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

Express (Node.js)
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
});
Next.js App Router (route handler)
// 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
}
Go net/http
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
})
Python FastAPI
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
Nginx
# 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: 1

Costuma 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.