# Implementación de HTTP/3 y QUIC en Nginx con TLS 1.3

- Link: https://binariocero.com/linux/implementacion-de-http-3-y-quic-en-nginx-con-tls-1-3
- Published: 2025-09-23T08:07:05+02:00
- Author: Juan José Fernández Durán

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

HTTP/3 y QUIC representan la evolución del protocolo web para mejorar la velocidad,
la eficiencia y la resiliencia de las conexiones. HTTP/3 se basa en QUIC, un protocolo
de transporte sobre **UDP**, que reemplaza el tradicional TCP utilizado por HTTP/
1.1 y HTTP/2. Entre sus principales ventajas se incluyen:

 * Reducción de la latencia mediante 0-RTT y multiplexación de streams.
 * Recuperación más rápida frente a pérdida de paquetes.
 * Movilidad y migración de conexiones sin interrumpir la sesión.

Nginx ha incorporado soporte para HTTP/3 y QUIC en su línea principal (mainline),
aunque algunas funcionalidades requieren builds específicos o parches adicionales.

## Contexto y directivas de configuración

La configuración de HTTP/3 y QUIC en Nginx se organiza en distintos **contextos**,
que determinan dónde se puede ubicar cada directiva:

| Directiva | Contexto | Función | 
| `http3 on/off` | http, server | Habilita la negociación del protocolo HTTP/3. | 
| `http3_hq on/off` | http, server | Habilita HTTP/0.9 para pruebas de interoperabilidad QUIC. | 
| `http3_max_concurrent_streams number` | http, server | Máximo de streams HTTP/3 concurrentes por conexión. | 
| `http3_stream_buffer_size size` | http, server | Tamaño del buffer para lectura/escritura de streams QUIC. | 
| `quic_active_connection_id_limit number` | http, server | Límite de IDs de conexión activas en el servidor. | 
| `quic_bpf on/off` | main | Permite la migración de conexiones QUIC mediante eBPF (Linux ≥5.7). | 
| `quic_gso on/off` | http, server | Optimiza el envío en lotes usando UDP_SEGMENT. | 
| `quic_host_key file` | http, server | Clave secreta para tokens de validación y resets sin estado. | 
| `quic_retry on/off` | http, server | Habilita retry de QUIC para validación de dirección. | 
| `ssl_early_data on/off` | http, server, location | Habilita 0-RTT en TLS 1.3. |

## Configuración general

A continuación, se presenta un ejemplo completo de configuración mínima de Nginx
con soporte HTTP/3 y QUIC:

    ```wp-block-code
    # --- MAIN CONTEXT ---
    worker_processes auto;
    error_log /var/log/nginx/error.log notice;

    quic_bpf off;  # requiere Linux ≥5.7

    events {
        worker_connections 1024;
    }

    http {
        include mime.types;
        default_type application/octet-stream;

            log_format quic '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" "$http3"';

        access_log /var/log/nginx/access.log quic;

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        # --- HTTP/3 & QUIC ---
        http3 on;
        http3_hq off;
        http3_max_concurrent_streams 128;
        http3_stream_buffer_size 64k;
        quic_active_connection_id_limit 2;
        quic_gso off;
        quic_retry off;

        ssl_protocols TLSv1.3;
        ssl_prefer_server_ciphers off;

        server {
            listen 443 ssl http2;
            listen 443 quic reuseport;

            server_name ejemplo.com;

            ssl_certificate /etc/nginx/certs/fullchain.pem;
            ssl_certificate_key /etc/nginx/certs/privkey.pem;
            quic_host_key /etc/nginx/quic_host.key;

            ssl_early_data on;  # habilita 0-RTT

            add_header Alt-Svc 'h3=":443"; ma=86400; persist=1';
            add_header QUIC-Status $quic;

            root /var/www/html;
            index index.html index.htm;

            location / {
                try_files $uri $uri/ =404;
            }

            location /static/ {
                ssl_early_data on;  # solo en recursos estáticos
            }

            location /login {
                ssl_early_data off;  # no permitir 0-RTT en rutas sensibles
            }
        }
    }
    ```

## Generación de la clave QUIC

QUIC requiere una clave secreta para tokens de validación y resets sin estado (`
quic_host_key`). Se puede generar con OpenSSL:

    ```wp-block-code
    openssl genpkey -algorithm X25519 -out /etc/nginx/quic_host.key
    chown root:root /etc/nginx/quic_host.key
    chmod 600 /etc/nginx/quic_host.key
    ```

> Nota: La clave debe permanecer secreta y persistente. Si se cambia, los tokens
> generados con la clave anterior serán inválidos.

## Pruebas y verificación

Para comprobar que el servidor soporta HTTP/3 y QUIC:

    ```wp-block-code
    # Usando curl compilado con soporte HTTP/3
    curl -I --http3 https://ejemplo.com/
    ```

Se puede verificar la cabecera `Alt-Svc` para confirmar que el navegador detecta
HTTP/3:

    ```wp-block-code
    curl -sI https://ejemplo.com | grep Alt-Svc
    ```

## Consideraciones de seguridad

 1. **Early Data (0-RTT):** permite enviar peticiones antes de completar el handshake
    TLS. Esto incrementa el riesgo de ataques de repetición (replay attacks). Solo 
    debe habilitarse en **peticiones idempotentes**, como recursos estáticos. Nunca
    en rutas de login o transacciones.
 2. **QUIC y firewalls:** QUIC utiliza UDP; asegúrate de abrir los puertos correspondientes(
    por defecto UDP/443).
 3. **Compatibilidad kernel:** Directivas como `quic_bpf` y `quic_gso` dependen de 
    características del kernel Linux moderno (≥5.7 y soporte UDP_SEGMENT).
 4. **Tokens y claves:** La gestión de `quic_host_key` es crítica. Cambiarla invalida
    tokens activos; se recomienda rotación controlada solo si es necesario.

## Conclusión

Integrar **HTTP/3 y QUIC en Nginx** permite mejorar significativamente el rendimiento
de sitios web modernos, especialmente en entornos con alta latencia o clientes móviles.
La correcta configuración de directivas, junto con TLS 1.3 y early data controlado,
garantiza un equilibrio entre **rendimiento** y **seguridad**.

Este artículo proporciona una guía completa y un ejemplo de configuración listo 
para producción, que puede adaptarse según necesidades de virtualhosts, certificados
y rutas específicas.
