Ativar a troca de chaves pós-quântica híbrida costuma ser uma alteração de uma única linha, desde que a biblioteca TLS subjacente suporte o ML-KEM. Este guia cobre os quatro servidores mais comuns. Testamos a configuração do nginx abaixo com o OpenSSL 3.5 em nossos próprios testes de integração.
Passo 0: verificar a biblioteca TLS
Os grupos ML-KEM estão integrados ao OpenSSL 3.5 e posteriores. Verifique a versão que o seu servidor realmente usa, que pode ser diferente da ferramenta de linha de comando:
openssl version
nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]*'
apachectl -V | grep -i openssl
haproxy -vv | grep -i openssl
Se a versão for anterior à 3.5, atualize os pacotes do sistema operacional ou use uma compilação vinculada a um OpenSSL recente. O Debian 13 (trixie), por exemplo, traz o OpenSSL 3.5. Sem isso, as diretivas abaixo vão falhar ou ser ignoradas.
nginx
No bloco server (ou no bloco http), permita o TLS 1.3 e coloque o grupo híbrido primeiro, seguido dos fallbacks clássicos:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1;
Apesar do nome, ssl_ecdh_curve define a lista de grupos de troca de chaves repassada ao OpenSSL. Recarregue com nginx -t && systemctl reload nginx.
Apache HTTP Server
Com o mod_ssl vinculado ao OpenSSL 3.5 ou posterior, passe a lista de grupos diretamente ao OpenSSL:
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOpenSSLConfCmd Groups X25519MLKEM768:X25519:prime256v1
Coloque as diretivas no virtual host ou na configuração SSL global, depois execute apachectl configtest e recarregue.
HAProxy
Na seção global, defina os grupos padrão para todas as linhas bind:
global
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-curves X25519MLKEM768:X25519:P-256
Você também pode definir curves em uma linha bind específica. O HAProxy precisa ser compilado com o OpenSSL 3.5 ou posterior; verifique com haproxy -vv.
Caddy
O Caddy usa a pilha TLS do Go, que ativa o X25519MLKEM768 por padrão a partir do Go 1.24. Versões recentes do Caddy compiladas com Go 1.24 ou posterior, portanto, o negociam sem nenhuma configuração. Se o seu Caddyfile restringe as curvas em um bloco tls, adicione o grupo híbrido explicitamente:
tls {
curves x25519mlkem768 x25519
}
Atrás de uma CDN ou de um balanceador de carga
Ative o grupo no componente que termina o TLS para os visitantes: a CDN, o balanceador de carga na nuvem ou o proxy reverso. Depois faça o mesmo na conexão desse componente com os seus servidores de origem, que é um link TLS separado e muitas vezes esquecido.
Mantenha um fallback
Mantenha sempre um grupo clássico, como o X25519, depois do híbrido. Clientes que não suportam o ML-KEM simplesmente negociam o X25519, então nada quebra. O ClientHello híbrido é cerca de um kilobyte maior; alguns middleboxes antigos já lidaram mal com handshakes grandes no passado, o que é mais um motivo para manter o fallback e monitorar erros após a mudança.
Verifique
openssl s_client -connect www.example.com:443 -servername www.example.com \
-groups X25519MLKEM768 -brief </dev/null | grep 'Negotiated'
Você deve ver Negotiated TLS1.3 group: X25519MLKEM768. Você também pode usar o scanner da PQC Status, que verifica ainda as versões de TLS, as suítes de cifras e a cadeia de certificados. Registre a mudança e a data no seu inventário criptográfico.
Qual grupo escolher?
O X25519MLKEM768 é a escolha padrão: recomendado pela IANA e suportado por todos os principais navegadores. Se você segue as recomendações da ANSSI para sistemas sensíveis, que prefere o nível de segurança mais alto, adicione primeiro o SecP384r1MLKEM1024 para os clientes que o suportam. Grupos ML-KEM puros, sem componente clássico, não são recomendados pela ANSSI nem pelo BSI, que pedem ambos o modo híbrido.