Activar el intercambio de claves poscuántico híbrido suele requerir un cambio de una sola línea, siempre que la biblioteca TLS subyacente admita ML-KEM. Esta guía abarca los cuatro servidores más habituales. Hemos probado la configuración de nginx que figura a continuación con OpenSSL 3.5 en nuestras propias pruebas de integración.
Paso 0: comprobar la biblioteca TLS
Los grupos ML-KEM están integrados en OpenSSL 3.5 y posteriores. Compruebe la versión que utiliza realmente su servidor, que puede ser distinta de la de la herramienta de línea de comandos:
openssl version
nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]*'
apachectl -V | grep -i openssl
haproxy -vv | grep -i openssl
Si la versión es anterior a la 3.5, actualice los paquetes del sistema operativo o utilice una compilación enlazada con un OpenSSL reciente. Debian 13 (trixie), por ejemplo, incluye OpenSSL 3.5. Sin ello, las directivas siguientes fallarán o se ignorarán.
nginx
En el bloque server (o en el bloque http), permita TLS 1.3 y coloque el grupo híbrido en primer lugar, seguido de las alternativas clásicas:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1;
A pesar de su nombre, ssl_ecdh_curve define la lista de grupos de intercambio de claves que se pasa a OpenSSL. Recargue con nginx -t && systemctl reload nginx.
Apache HTTP Server
Con mod_ssl enlazado a OpenSSL 3.5 o posterior, pase la lista de grupos directamente a OpenSSL:
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOpenSSLConfCmd Groups X25519MLKEM768:X25519:prime256v1
Coloque las directivas en el host virtual o en la configuración SSL global y, a continuación, ejecute apachectl configtest y recargue.
HAProxy
En la sección global, defina los grupos predeterminados para todas las líneas bind:
global
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-curves X25519MLKEM768:X25519:P-256
También puede definir curves en una línea bind concreta. HAProxy debe estar compilado con OpenSSL 3.5 o posterior; compruébelo con haproxy -vv.
Caddy
Caddy utiliza la pila TLS de Go, que activa X25519MLKEM768 por defecto a partir de Go 1.24. Por tanto, las versiones recientes de Caddy compiladas con Go 1.24 o posterior lo negocian sin ninguna configuración. Si su Caddyfile restringe las curvas en un bloque tls, añada explícitamente el grupo híbrido:
tls {
curves x25519mlkem768 x25519
}
Detrás de una CDN o de un balanceador de carga
Active el grupo en el componente que termina el TLS de los visitantes: la CDN, el balanceador de carga en la nube o el proxy inverso. Después, haga lo mismo con la conexión entre ese componente y sus servidores de origen, que es un enlace TLS independiente y a menudo se olvida.
Mantener una alternativa
Mantenga siempre un grupo clásico, como X25519, después del híbrido. Los clientes que no admiten ML-KEM simplemente negocian X25519, por lo que nada deja de funcionar. El ClientHello híbrido es aproximadamente un kilobyte mayor; algunos equipos intermedios antiguos han gestionado mal negociaciones de gran tamaño en el pasado, lo que es otra razón para mantener la alternativa y supervisar los errores tras el cambio.
Verificar
openssl s_client -connect www.example.com:443 -servername www.example.com \
-groups X25519MLKEM768 -brief </dev/null | grep 'Negotiated'
Debería ver Negotiated TLS1.3 group: X25519MLKEM768. También puede usar el escáner de PQC Status, que además comprueba las versiones de TLS, los conjuntos de cifrado y la cadena de certificados. Registre el cambio y su fecha en su inventario criptográfico.
¿Qué grupo elegir?
X25519MLKEM768 es la opción predeterminada: recomendado por la IANA y compatible con todos los navegadores principales. Si sigue las recomendaciones de la ANSSI para sistemas sensibles, que prefieren el nivel de seguridad más alto, añada SecP384r1MLKEM1024 en primer lugar para los clientes que lo admitan. Los grupos ML-KEM puros, sin componente clásico, no están recomendados por la ANSSI ni por la BSI, que piden ambas el modo híbrido.