Incidente relacionado · compromiso de claves de CA · 17–21 de octubre de 2026
Claves de CA intermedias de eMudhra comprometidas: qué deben revisar los servidores PHP
Los navegadores quedaron protegidos en horas. Con PHP es distinto: las extensiones curl y OpenSSL confían en el paquete de CA del servidor y normalmente no reciben las listas de revocación de los navegadores.
Última actualización
Qué pasó
- El 17 de octubre de 2026 un investigador informó de que ocho certificados de CA intermedia de eMudhra (seis TLS y dos de firma de código) tenían claves P-384 que eran enteros menores que 256: 4, 56, 66, 115, 155, 156, 230 y 237. Mozilla confirmó que cada clave era cero salvo el último byte (Bugzilla 2083449).
- Según eMudhra, las claves provienen de una ceremonia del 30 de abril de 2025 en HSM FIPS 140-2 nivel 3, donde un paso de wrap/unwrap generó un segundo juego de claves débiles que se publicó por error.
- Las intermedias TLS encadenan a emSign ECC Root CA - G3. La raíz AAA Certificate Services de Sectigo había firmado de forma cruzada las mismas claves; Sectigo revocó esas firmas el 19 de octubre.
| Fecha | Evento |
|---|---|
| 17/10/2026, 18:05 | El informe llega al Chrome Root Program |
| 17/10, 19:45 | Chrome bloquea las seis intermedias TLS mediante CRLSet |
| 17/10, 22:59 | Firefox bloquea las ocho mediante OneCRL |
| 18/10 | eMudhra revoca los ocho certificados |
| 19/10 | Apple los bloquea; Sectigo revoca sus firmas cruzadas |
| 20/10 | Microsoft los bloquea; NSS 3.131.1 retira emSign ECC Root CA - G3; cacert.pem de curl 2026-10-20; composer/ca-bundle 1.4.16 y 1.6.0 |
| 27/10 (previsto) | El Chrome Root Store retira emSign ECC Root CA - G3 en todos los dispositivos |
¿Afecta a mi servidor PHP?
PHP no trae su propia lista de CA. Las extensiones openssl y curl leen openssl.cafile / curl.cainfo si están definidos y, si no, las rutas por defecto de OpenSSL, normalmente el paquete ca-certificates de la distribución. No reciben CRLSet ni OneCRL. Si ese paquete aún contiene emSign ECC Root CA - G3 (o AAA Certificate Services para las firmas cruzadas), su servidor sigue confiando en la cadena comprometida.
# 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 versionsCompruebe cada SAPI relevante. PHP-FPM y Apache mod_php pueden cargar un php.ini distinto al de la CLI; compare php --ini con una página phpinfo() servida por el sitio.
Cómo solucionarlo
# 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.Los entornos todo en uno antiguos y los paneles sin mantenimiento suelen fijar curl.cainfo a un archivo incluido con el producto que nunca se renueva. Revise las notas de versión del fabricante o apunte php.ini a un cacert.pem actual como se indica arriba.
Quién ha publicado una corrección
| Software | Versión corregida |
|---|---|
| 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 |
Descargamos el cacert.pem actual de curl (Last-Modified 20 de octubre de 2026) y ya no contiene emSign ECC Root CA - G3 ni AAA Certificate Services. composer/ca-bundle 1.4.16 y 1.6.0 añaden además CaBundle::findDistrustedCertificate.
Las versiones que no aparecen, incluidas distribuciones antiguas como Ubuntu 20.04 o Debian 11, no figuraban como corregidas en las fuentes revisadas. Consulte el sistema de seguimiento de su proveedor.
Preguntas frecuentes
Paquetes integrados y paneles de hosting
XAMPP y los paneles de hosting incluyen sus propias compilaciones de PHP, así que su paquete CA puede no seguir las actualizaciones de ca-certificates del sistema. Vea las páginas de XAMPP, cPanel, Plesk, DirectAdmin, CloudLinux, aaPanel y 宝塔面板, o la lista de productos.
¿Está afectado el certificado de mi sitio?
Es muy improbable. eMudhra afirma que las ocho intermedias no emitieron certificados finales, y Chrome no encontró ninguno en los registros de Certificate Transparency antes del bloqueo. Los sitios con certificados bajo emSign ECC Root CA - G3 sí necesitan uno nuevo, porque esa raíz se está retirando.
¿Quedaron inseguros decenas de millones de certificados?
No. Las grandes cifras que circulan corresponden a la emisión histórica total de eMudhra, no a certificados firmados con las claves comprometidas.
¿Por qué importa a un servidor PHP si los navegadores están protegidos?
Los navegadores exigen Certificate Transparency y reciben CRLSet u OneCRL. curl y OpenSSL en PHP no suelen hacer ninguna de las dos cosas y solo están protegidos cuando el paquete de CA que leen deja de confiar en la cadena de eMudhra: APIs de pago, webhooks, SMTP sobre TLS y descargas de Composer.
¿Qué paquete usa PHP?
curl.cainfo y openssl.cafile si están definidos en php.ini; si no, las rutas por defecto compiladas en OpenSSL, normalmente el paquete ca-certificates de la distribución. Composer usa composer/ca-bundle, que prefiere el paquete del sistema y, si no lo encuentra, su propio cacert.pem.
Fuentes
Los enlaces externos salen de este sitio. No alojamos código de explotación.
- 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