Activer l'échange de clés post-quantique hybride tient généralement en une ligne, à condition que la bibliothèque TLS sous-jacente prenne en charge ML-KEM. Ce guide couvre les quatre serveurs les plus courants. Nous avons testé la configuration nginx ci-dessous avec OpenSSL 3.5 dans nos propres tests d'intégration.
Étape 0 : vérifier la bibliothèque TLS
Les groupes ML-KEM sont intégrés à OpenSSL 3.5 et versions ultérieures. Vérifiez la version réellement utilisée par votre serveur, qui peut différer de celle de l'outil en ligne de commande :
openssl version
nginx -V 2>&1 | grep -o 'OpenSSL [0-9.]*'
apachectl -V | grep -i openssl
haproxy -vv | grep -i openssl
Si la version est antérieure à 3.5, mettez à jour les paquets du système d'exploitation ou utilisez une compilation liée à un OpenSSL récent. Debian 13 (trixie), par exemple, fournit OpenSSL 3.5. Sans cela, les directives ci-dessous échoueront ou seront ignorées.
nginx
Dans le bloc server (ou le bloc http), autorisez TLS 1.3 et placez le groupe hybride en premier, suivi des groupes classiques de repli :
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ecdh_curve X25519MLKEM768:X25519:prime256v1;
Malgré son nom, ssl_ecdh_curve définit la liste des groupes d'échange de clés transmise à OpenSSL. Rechargez avec nginx -t && systemctl reload nginx.
Apache HTTP Server
Avec mod_ssl lié à OpenSSL 3.5 ou ultérieur, transmettez directement la liste des groupes à OpenSSL :
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLOpenSSLConfCmd Groups X25519MLKEM768:X25519:prime256v1
Placez les directives dans l'hôte virtuel ou dans la configuration SSL globale, puis exécutez apachectl configtest et rechargez.
HAProxy
Dans la section global, définissez les groupes par défaut pour toutes les lignes bind :
global
ssl-default-bind-options ssl-min-ver TLSv1.2
ssl-default-bind-curves X25519MLKEM768:X25519:P-256
Vous pouvez aussi définir curves sur une ligne bind individuelle. HAProxy doit être compilé avec OpenSSL 3.5 ou ultérieur ; vérifiez avec haproxy -vv.
Caddy
Caddy utilise la pile TLS de Go, qui active X25519MLKEM768 par défaut à partir de Go 1.24. Les versions récentes de Caddy compilées avec Go 1.24 ou ultérieur le négocient donc sans aucune configuration. Si votre Caddyfile restreint les courbes dans un bloc tls, ajoutez explicitement le groupe hybride :
tls {
curves x25519mlkem768 x25519
}
Derrière un CDN ou un répartiteur de charge
Activez le groupe sur le composant qui termine TLS pour les visiteurs : le CDN, le répartiteur de charge cloud ou le proxy inverse. Faites ensuite de même pour la connexion entre ce composant et vos serveurs d'origine, un lien TLS distinct souvent oublié.
Conserver une solution de repli
Conservez toujours un groupe classique comme X25519 après le groupe hybride. Les clients qui ne prennent pas en charge ML-KEM négocient simplement X25519 : rien ne casse. Le ClientHello hybride est plus volumineux d'environ un kilo-octet ; par le passé, quelques anciens équipements intermédiaires ont mal géré les négociations volumineuses, raison de plus pour conserver le repli et surveiller les erreurs après la modification.
Vérifier
openssl s_client -connect www.example.com:443 -servername www.example.com \
-groups X25519MLKEM768 -brief </dev/null | grep 'Negotiated'
Vous devriez voir Negotiated TLS1.3 group: X25519MLKEM768. Vous pouvez aussi lancer le scanner PQC Status, qui vérifie en plus les versions TLS, les suites cryptographiques et la chaîne de certificats. Consignez la modification et sa date dans votre inventaire cryptographique.
Quel groupe choisir ?
X25519MLKEM768 est le choix par défaut : recommandé par l'IANA et pris en charge par tous les grands navigateurs. Si vous suivez les recommandations de l'ANSSI pour les systèmes sensibles, qui privilégient le niveau de sécurité le plus élevé, ajoutez SecP384r1MLKEM1024 en premier pour les clients qui le prennent en charge. Les groupes ML-KEM purs, sans composante classique, ne sont recommandés ni par l'ANSSI ni par le BSI, qui demandent tous deux le mode hybride.