関連インシデント · CA 秘密鍵の漏えい · 2026年10月17〜21日
eMudhra 中間 CA 秘密鍵の漏えい:PHP サーバーで確認すべきこと
ブラウザは数時間で保護されました。PHP は事情が違います。curl と OpenSSL 拡張はサーバーの CA バンドルをそのまま信頼し、ブラウザ向けの失効リストは通常受け取らないため、古いバンドルが問題になります。
最終更新
何が起きたか
- 2026年10月17日、eMudhra の中間 CA 証明書 8 件(TLS 用 6、コード署名用 2)の P-384 秘密鍵が 256 未満の整数(4、56、66、115、155、156、230、237)であると報告されました。Mozilla は最後の 1 バイト以外がすべて 0 であることを確認しています(Bugzilla 2083449)。
- eMudhra によると、鍵は2025年4月30日に FIPS 140-2 Level 3 の HSM で行われた鍵生成セレモニーで作られ、wrap/unwrap の手順で別の弱い鍵が生成され、誤って公開されました。
- TLS 用の中間 CA は emSign ECC Root CA - G3 につながります。Sectigo の AAA Certificate Services も同じ鍵をクロス署名しており、Sectigo は10月19日に失効させました。
| 日時 | 出来事 |
|---|---|
| 2026-10-17 18:05 | Chrome ルートプログラムに報告 |
| 10-17 19:45 | Chrome が CRLSet で TLS 中間 CA 6 件を公開鍵単位でブロック |
| 10-17 22:59 | Firefox が OneCRL で 8 件すべてをブロック |
| 10-18 | eMudhra が 8 件を失効 |
| 10-19 | Apple がブロック、Sectigo がクロス署名を失効 |
| 10-20 | Microsoft がブロック。NSS 3.131.1 が emSign ECC Root CA - G3 を削除。curl の cacert.pem 2026-10-20、composer/ca-bundle 1.4.16・1.6.0 |
| 10-27(予定) | Chrome Root Store が全デバイスで emSign ECC Root CA - G3 を削除 |
自分の PHP サーバーは影響を受けるか
PHP は独自の CA リストを持ちません。openssl と curl 拡張は openssl.cafile / curl.cainfo が設定されていればそれを読み、なければ OpenSSL の既定パス(通常はディストリビューションの ca-certificates)を使います。CRLSet や OneCRL は受け取りません。そのバンドルに emSign ECC Root CA - G3(クロス署名の場合は AAA Certificate Services)が残っていれば、サーバーは漏えいしたチェーンをまだ信頼しています。
# 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 versionsSAPI ごとに確認してください。PHP-FPM や Apache mod_php は CLI と異なる php.ini を読むことがあるため、php --ini とサイトの phpinfo() を比べます。
対処方法
# 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.古いオールインワン環境や長く更新されていないパネルは、curl.cainfo を製品同梱の更新されないファイルに固定していることがよくあります。ベンダーの更新情報を確認するか、上記のように最新の cacert.pem を指定してください。
修正済みのソフトウェア
| ソフトウェア | 修正版 |
|---|---|
| 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 |
当サイトで curl の公開中の cacert.pem(Last-Modified は2026年10月20日)を取得したところ、emSign ECC Root CA - G3 と AAA Certificate Services のどちらも含まれていませんでした。composer/ca-bundle 1.4.16 と 1.6.0 は CaBundle::findDistrustedCertificate も追加しています。
この一覧にないリリース(Ubuntu 20.04 や Debian 11 など)は、参照した情報源では修正済みと示されていません。ベンダーのトラッカーで確認してください。
よくある質問
統合環境とホスティングパネル
XAMPP やホスティングパネルは独自の PHP ビルドを同梱しているため、CA バンドルが OS の ca-certificates 更新に追従しないことがあります。XAMPP、cPanel、Plesk、DirectAdmin、CloudLinux、aaPanel、宝塔面板 の製品ページ、または製品一覧を確認してください。
自分のサイトの証明書は影響を受けますか?
可能性は低いです。eMudhra は 8 件の中間 CA がエンドエンティティ証明書を発行していないとし、Chrome もブロック前に CT ログへの記録はなかったとしています。ただし emSign ECC Root CA - G3 につながる証明書を使うサイトは、ルートが削除されるため証明書の再取得が必要です。
数千万枚の証明書が危険になったのですか?
いいえ。出回っている大きな数字は eMudhra の過去の総発行数で、漏えいした鍵で署名された証明書の数ではありません。
ブラウザが安全なら PHP サーバーは関係ないのでは?
ブラウザは CT を強制し、CRLSet や OneCRL を受け取ります。PHP の curl や OpenSSL は通常どちらも行わないため、読み込む CA バンドルが eMudhra のチェーンを信頼しなくなるまで保護されません。決済 API、Webhook、SMTP over TLS、Composer のダウンロードなどの外向き通信が対象です。
PHP はどのバンドルを使っていますか?
php.ini で curl.cainfo と openssl.cafile が設定されていればそれを、なければ OpenSSL のビルド時の既定パス(通常はディストリビューションの ca-certificates)を使います。Composer などは composer/ca-bundle を使い、システムのバンドルを優先し、見つからない場合に同梱の cacert.pem を使います。
出典
外部リンクは本サイトの外に移動します。本サイトはエクスプロイトコードを掲載しません。
- 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