Abilitare lo scambio di chiavi ibrido post-quantistico richiede di solito la modifica di una sola riga, a condizione che la libreria TLS sottostante supporti ML-KEM. Questa guida copre i quattro server più diffusi. Abbiamo testato la configurazione nginx riportata qui sotto con OpenSSL 3.5 nei nostri test di integrazione.
Passo 0: verifica la libreria TLS
I gruppi ML-KEM sono integrati in OpenSSL 3.5 e successivi. Verifica la versione effettivamente usata dal tuo server, che può essere diversa da quella dello strumento a riga di comando:
openssl version
nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]*'
apachectl -V | grep -i openssl
haproxy -vv | grep -i openssl
Se la versione è precedente alla 3.5, aggiorna i pacchetti del sistema operativo o usa una build collegata a un OpenSSL recente. Debian 13 (trixie), ad esempio, include OpenSSL 3.5. Senza di esso, le direttive seguenti falliranno o verranno ignorate.
nginx
Nel blocco server (o nel blocco http), consenti TLS 1.3 e metti per primo il gruppo ibrido, seguito dai fallback classici:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1;
Nonostante il nome, ssl_ecdh_curve imposta l'elenco dei gruppi di scambio di chiavi passati a OpenSSL. Ricarica con nginx -t && systemctl reload nginx.
Apache HTTP Server
Con mod_ssl collegato a OpenSSL 3.5 o successivo, passa l'elenco dei gruppi direttamente a OpenSSL:
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOpenSSLConfCmd Groups X25519MLKEM768:X25519:prime256v1
Inserisci le direttive nel virtual host o nella configurazione SSL globale, poi esegui apachectl configtest e ricarica.
HAProxy
Nella sezione global, imposta i gruppi predefiniti per tutte le righe bind:
global
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-curves X25519MLKEM768:X25519:P-256
Puoi anche impostare curves su una singola riga bind. HAProxy deve essere compilato con OpenSSL 3.5 o successivo; verifica con haproxy -vv.
Caddy
Caddy usa lo stack TLS di Go, che abilita X25519MLKEM768 per impostazione predefinita a partire da Go 1.24. Le release recenti di Caddy compilate con Go 1.24 o successivo lo negoziano quindi senza alcuna configurazione. Se il tuo Caddyfile limita le curve in un blocco tls, aggiungi esplicitamente il gruppo ibrido:
tls {
curves x25519mlkem768 x25519
}
Dietro una CDN o un load balancer
Abilita il gruppo sul componente che termina il TLS per i visitatori: la CDN, il load balancer cloud o il reverse proxy. Poi fai lo stesso per la connessione da quel componente ai tuoi server di origine, che è un collegamento TLS distinto e spesso dimenticato.
Mantieni un fallback
Mantieni sempre un gruppo classico come X25519 dopo quello ibrido. I client che non supportano ML-KEM negoziano semplicemente X25519, quindi nulla si interrompe. Il ClientHello ibrido è più grande di circa un kilobyte; in passato alcuni vecchi middlebox hanno gestito male gli handshake di grandi dimensioni, un motivo in più per mantenere il fallback e monitorare gli errori dopo la modifica.
Verifica
openssl s_client -connect www.example.com:443 -servername www.example.com \
-groups X25519MLKEM768 -brief </dev/null | grep 'Negotiated'
Dovresti vedere Negotiated TLS1.3 group: X25519MLKEM768. Puoi anche usare lo scanner PQC Status, che verifica inoltre le versioni TLS, le suite di cifratura e la catena di certificati. Registra la modifica e la sua data nel tuo inventario crittografico.
Quale gruppo scegliere?
X25519MLKEM768 è la scelta predefinita: raccomandato dalla IANA e supportato da tutti i principali browser. Se segui le raccomandazioni dell'ANSSI per i sistemi sensibili, che preferiscono il livello di sicurezza più elevato, aggiungi per primo SecP384r1MLKEM1024 per i client che lo supportano. I gruppi ML-KEM puri, senza componente classica, non sono raccomandati né dall'ANSSI né dal BSI, che chiedono entrambi la modalità ibrida.