# Habilitar el TLS 1.3 Early Data (0-RTT) en Nginx para múltiples sitios

- Link: https://binariocero.com/linux/habilitar-el-tls-1-3-early-data-0-rtt-en-nginx-para-multiples-sitios
- Published: 2026-01-29T11:44:37+01:00
- Author: Juan José Fernández Durán

![Loading](https://binariocero.com/wp-content/plugins/page-views-count/ajax-loader-
2x.gif)

El protocolo TLS 1.3 introdujo la capacidad de enviar **Early Data (0-RTT)**, lo
que permite a los clientes enviar datos al servidor durante la fase inicial del 
handshake TLS. Esto reduce la latencia en aplicaciones web críticas, especialmente
aquellas que requieren conexiones repetitivas. Nginx, a partir de la versión 1.19,
soporta esta característica mediante la directiva `ssl_early_data`.

Este artículo explica cómo configurar **TLS 1.3 Early Data** en un entorno Nginx
con múltiples sitios (`sites-enabled`), incluyendo soporte para **HTTP/2** y **HTTP/
3**, y las consideraciones de seguridad asociadas.

## Requisitos previos

 * Nginx ≥ 1.19 con soporte para TLS 1.3 y HTTP/3.
 * Certificados TLS válidos (por ejemplo, emitidos con Let's Encrypt y gestionados
   por Certbot).
 * Acceso a los archivos de configuración de Nginx (`nginx.conf` y `/etc/nginx/sites-
   enabled/*`).

## Configuración de un sitio con TLS 1.3 Early Data

 1. **Editar el bloque `server` en el archivo del sitio**, por ejemplo `/etc/nginx/
    sites-enabled/misitio.com`:

    ```wp-block-code
    server {
        listen 443 ssl http2;
        listen 443 quic reuseport;
        http3 on;
        server_name misitio.com;

        ssl_certificate /etc/letsencrypt/live/misitio.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/misitio.com/privkey.pem;

        # Configuración TLS recomendada
        ssl_protocols TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_early_data on;  # Habilita 0-RTT

        # Logs
        access_log /var/log/nginx/misitio_access.log;
        error_log /var/log/nginx/misitio_error.log;

        location / {
            root /var/www/misitio;
            index index.html;
        }

        # Alt-Svc para HTTP/3
        add_header Alt-Svc 'h3=":443"; ma=86400' always;
    }
    ```

 2. **Notas importantes:**
 3.  * `ssl_early_data on;` **solo funciona con TLS 1.3**.
     * Cada bloque `server` puede tener esta directiva de manera independiente, permitiendo
       habilitar Early Data solo en los sitios deseados.
     * Si se desea, se puede habilitar de manera global dentro del bloque `http { }`
       de `nginx.conf`, aunque esto es menos flexible.

## Consideraciones de seguridad

 * **Riesgo de replay attacks:** Early Data puede ser reenviado por un atacante 
   si la aplicación no maneja correctamente solicitudes idempotentes.
 * **Compatibilidad de clientes:** Algunos navegadores o librerías TLS antiguos 
   no soportan 0-RTT. Esto no genera errores, simplemente ignoran Early Data.
 * **Solo para TLS 1.3:** Asegúrese de no habilitarlo en protocolos anteriores.

## Configuración de múltiples sitios (`sites-enabled`)

Para un servidor Nginx con varios dominios, cada sitio SSL puede habilitar Early
Data de manera independiente:

    ```wp-block-code
    server {
        listen 443 ssl http2;
        server_name sitio1.com;
        ssl_certificate /etc/letsencrypt/live/sitio1.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sitio1.com/privkey.pem;
        ssl_protocols TLSv1.3;
        ssl_early_data on;
    }

    server {
        listen 443 ssl http2;
        server_name sitio2.com;
        ssl_certificate /etc/letsencrypt/live/sitio2.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/sitio2.com/privkey.pem;
        ssl_protocols TLSv1.3;
        ssl_early_data on;
    }
    ```

De esta manera, cada dominio puede beneficiarse de conexiones de baja latencia sin
afectar la configuración de los demás.

## Pruebas y validación

 1. Reiniciar Nginx tras los cambios:

    ```wp-block-code
    sudo nginx -t && sudo systemctl reload nginx
    ```

 2. Verificar la negociación TLS con OpenSSL:

    ```wp-block-code
    openssl s_client -connect misitio.com:443 -tls1_3 -early_data "GET / HTTP/1.1\r\nHost: misitio.com\r\n\r\n"
    ```

 3. Comprobar compatibilidad HTTP/3 usando herramientas como [Cloudflare TLS/HTTP3 test](https://www.cloudflare.com/ssl/encrypted-sni/)
    o navegadores modernos.

## Conclusión

Habilitar **TLS 1.3 Early Data (0-RTT)** en Nginx permite reducir la latencia en
sitios web críticos y es compatible con arquitecturas modernas que usan HTTP/2 y
HTTP/3. Con la configuración correcta por sitio, se obtiene un equilibrio entre 
rendimiento y seguridad, permitiendo que cada dominio gestione sus propios certificados
y políticas TLS.
