Incident connexe · compromission de clés d’AC · 17–21 octobre 2026
Clés d’AC intermédiaires eMudhra compromises : ce que les serveurs PHP doivent vérifier
Les navigateurs ont été protégés en quelques heures. Pour PHP, c’est différent : les extensions curl et OpenSSL font confiance au paquet d’AC du serveur et ne reçoivent généralement pas les listes de révocation des navigateurs.
Dernière mise à jour
Ce qui s’est passé
- Le 17 octobre 2026, un chercheur a signalé que huit certificats d’AC intermédiaires d’eMudhra (six TLS, deux de signature de code) avaient des clés P-384 égales à des entiers inférieurs à 256 : 4, 56, 66, 115, 155, 156, 230 et 237. Mozilla a confirmé que chaque clé était nulle sauf le dernier octet (Bugzilla 2083449).
- Selon eMudhra, les clés proviennent d’une cérémonie du 30 avril 2025 sur des HSM FIPS 140-2 niveau 3, où une étape wrap/unwrap a produit un second jeu de clés faibles, publié par erreur.
- Les intermédiaires TLS remontent à emSign ECC Root CA - G3. La racine AAA Certificate Services de Sectigo avait contre-signé les mêmes clés ; Sectigo a révoqué ces contre-signatures le 19 octobre.
| Date | Événement |
|---|---|
| 17/10/2026, 18:05 | Le signalement parvient au Chrome Root Program |
| 17/10, 19:45 | Chrome bloque les six intermédiaires TLS via CRLSet |
| 17/10, 22:59 | Firefox bloque les huit via OneCRL |
| 18/10 | eMudhra révoque les huit certificats |
| 19/10 | Apple les bloque ; Sectigo révoque ses contre-signatures |
| 20/10 | Microsoft les bloque ; NSS 3.131.1 retire emSign ECC Root CA - G3 ; cacert.pem de curl 2026-10-20 ; composer/ca-bundle 1.4.16 et 1.6.0 |
| 27/10 (prévu) | Le Chrome Root Store retire emSign ECC Root CA - G3 sur tous les appareils |
Mon serveur PHP est-il concerné ?
PHP n’embarque pas de liste d’AC. Les extensions openssl et curl lisent openssl.cafile / curl.cainfo s’ils sont définis, sinon les chemins par défaut d’OpenSSL, normalement le paquet ca-certificates de la distribution. Elles ne reçoivent ni CRLSet ni OneCRL. Si ce paquet contient encore emSign ECC Root CA - G3 (ou AAA Certificate Services pour les contre-signatures), votre serveur fait encore confiance à la chaîne compromise.
# Which CA file does PHP use? Run as the same user/SAPI as the site if you can.
php -r 'print_r(openssl_get_cert_locations());'
php -i | grep -E 'openssl.cafile|openssl.capath|curl.cainfo'# Does PHP still trust the compromised eMudhra intermediates?
# Good result: bool(false) plus a "certificate verify failed" warning.
# Bad result: the page body is printed (the chain was trusted).
php -r 'var_dump(file_get_contents("https://dv-g3b-emudhra.we-have-a-problem.com/"));'
php -r 'var_dump(file_get_contents("https://dv-g3b-aaa-emudhra.we-have-a-problem.com/"));'
# Same check through the curl extension
php -r '$c = curl_init("https://dv-g3b-emudhra.we-have-a-problem.com/");
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
var_dump(curl_exec($c), curl_error($c));'# Is the eMudhra root still in the bundle?
ls /etc/ssl/certs | grep -i emsign # Debian/Ubuntu symlinks
grep -n "emSign ECC Root CA - G3" /path/to/cacert.pem # curl/Mozilla-format bundle
# composer/ca-bundle version inside a project
composer show composer/ca-bundle | grep versionsVérifiez chaque SAPI utile. PHP-FPM et Apache mod_php peuvent charger un autre php.ini que la CLI ; comparez php --ini avec une page phpinfo() servie par le site.
Comment corriger
# Debian / Ubuntu (and Debian-based php:* Docker images)
sudo apt-get update && sudo apt-get install --only-upgrade ca-certificates
dpkg -l ca-certificates
# RHEL / Fedora / AlmaLinux / Rocky
sudo dnf upgrade ca-certificates
# Alpine (php:*-alpine images)
apk upgrade --no-cache ca-certificates
# Composer projects that ship composer/ca-bundle
composer update composer/ca-bundle # 1.4.16+ or 1.6.0+
# Restart long-running PHP processes afterwards
sudo systemctl restart php8.3-fpm # or apache2 / httpd / your queue workers; php.ini — for stacks with their own stale bundle (XAMPP, WAMP, old panels)
; Download a current Mozilla-derived bundle from https://curl.se/ca/cacert.pem
; (the 2026-10-20 release or later), then point both settings at it:
curl.cainfo = "/path/to/cacert.pem"
openssl.cafile = "/path/to/cacert.pem"
; Restart Apache / PHP-FPM so the new values load.Les anciennes piles tout-en-un et les panneaux non maintenus fixent souvent curl.cainfo sur un fichier livré avec le produit et jamais renouvelé. Consultez les notes de version de l’éditeur ou pointez php.ini vers un cacert.pem à jour comme ci-dessus.
Qui a publié un correctif
| Logiciel | Version corrigée |
|---|---|
| Mozilla NSS | 3.131.1 (Bug 2084101) |
| curl CA bundle (cacert.pem) | 2026-10-20 |
| composer/ca-bundle | 1.4.16, 1.6.0 (2026-10-20) |
| Debian ca-certificates | 20250419~deb12u2, 20250419+deb13u1, 20260816+nmu1 |
| Ubuntu ca-certificates | 20260816ubuntu0.22.04.1, 0.24.04.1, 0.26.04.1, 0.26.10.1 |
| Fedora ca-certificates | 2026.2.92_v9.0.319 |
| Alpine ca-certificates | 20261020-r0 |
| Arch ca-certificates-mozilla | 3.131.1-1 |
| FreeBSD ca_root_nss | 1.131.1 |
Nous avons récupéré le cacert.pem actuel de curl (Last-Modified 20 octobre 2026) : il ne contient plus ni emSign ECC Root CA - G3 ni AAA Certificate Services. composer/ca-bundle 1.4.16 et 1.6.0 ajoutent aussi CaBundle::findDistrustedCertificate.
Les versions absentes de la liste, y compris d’anciennes distributions comme Ubuntu 20.04 ou Debian 11, n’apparaissaient pas comme corrigées dans les sources consultées. Vérifiez le suivi de votre éditeur.
FAQ
Piles intégrées et panneaux d’hébergement
XAMPP et les panneaux d’hébergement embarquent leurs propres PHP ; leur bundle CA ne suit donc pas forcément les mises à jour ca-certificates du système. Voir les pages XAMPP, cPanel, Plesk, DirectAdmin, CloudLinux, aaPanel et 宝塔面板, ou la liste des produits.
Le certificat de mon site est-il touché ?
Très peu probable. eMudhra affirme que les huit intermédiaires n’ont émis aucun certificat final, et Chrome n’en a trouvé aucun dans les journaux Certificate Transparency avant le blocage. Les sites dont le certificat remonte à emSign ECC Root CA - G3 doivent toutefois en obtenir un nouveau, car cette racine est retirée.
Des dizaines de millions de certificats sont-ils compromis ?
Non. Les grands chiffres qui circulent correspondent à l’émission historique totale d’eMudhra, pas aux certificats signés par les clés compromises.
Pourquoi un serveur PHP est-il concerné si les navigateurs sont protégés ?
Les navigateurs imposent Certificate Transparency et reçoivent CRLSet ou OneCRL. curl et OpenSSL dans PHP ne font généralement ni l’un ni l’autre : ils ne sont protégés que lorsque le paquet d’AC lu ne fait plus confiance à la chaîne eMudhra (API de paiement, webhooks, SMTP sur TLS, téléchargements Composer).
Quel paquet PHP utilise-t-il ?
curl.cainfo et openssl.cafile s’ils sont définis dans php.ini, sinon les chemins par défaut compilés dans OpenSSL, en général le paquet ca-certificates de la distribution. Composer utilise composer/ca-bundle, qui préfère le paquet système et se rabat sur son propre cacert.pem.
Sources
Les liens externes quittent ce site. Nous n’hébergeons aucun code d’exploitation.
- Protecting Firefox users following the compromise of eMudhra intermediate certificates (20 October 2026) — Mozilla Security Blog
- Protecting Chrome and Android users from compromised eMudhra intermediate CA certificates — Google (Chrome and Android Security)
- eMudhra statement on recent certificate security incident (updated 21 October 2026) — eMudhra
- eMudhra Intermediate CA Compromise: client check and patched-software list — we-have-a-problem.com (reporter’s test site)
- Bug 2083449 — eMudhra: Private key compromise of Intermediate Certificates — Mozilla Bugzilla
- Bug 2084101 — Remove eMudhra emSign Root CA - G3 from NSS — Mozilla Bugzilla
- Compromised eMudhra Intermediate Certificates (guidance for trust store operators) — Mozilla dev-security-policy
- Indian certification authority eMudhra’s private keys compromised – one of them was the number 4 (20 October 2026) — The Register
- eMudhra’s weak P-384 CA keys: testing curl, Node.js and uv (21 October 2026) — lilting channel
- CA certificates extracted from Mozilla (cacert.pem) — curl project
- composer/ca-bundle 1.6.0 and 1.4.16: distrust compromised eMudhra intermediates — Composer (GitHub)
- OpenSSL runtime configuration (openssl.cafile, openssl.capath) — PHP manual
- cURL runtime configuration (curl.cainfo) — PHP manual