Eight CA keys, generated weak, recovered by a researcher
An intermediate CA key lets you issue a certificate for any domain that browsers will accept. Eight of eMudhra's were generated so weakly that someone worked them out from the public certificates — one of them was the number 4.
On 17 October 2026 at 20:06 UTC, Mozilla received a report that the private keys of eight eMudhra intermediate CA certificates were compromised. Chrome verified the finding, and both Chrome and Firefox blocked all eight within hours. The root programs confirmed publicly on 20 October.
An intermediate CA certificate signs the certificates that websites present. Hold its private key and you can issue a certificate for any name — a bank, a government service, an update server — and a browser that trusts the chain will accept it. Two of the eight were code-signing intermediates, which extends the same problem to signed software.
The mechanism
eMudhra's own account, filed with the BSE stock exchange on 21 October, is that the eight intermediates were created under its ECC root in a key generation ceremony on 30 April 2025, using hardware security modules certified to FIPS 140-2 Level 3, and that a flaw in that ceremony corrupted a key wrap and unwrap step. The result was key material with far less entropy than its size implied. A researcher found over the weekend of 17 October that the keys could be reverse-engineered — eMudhra's statement says "possibly with AI-assisted techniques" — and reported it to Apple, Google, Microsoft and Mozilla. One of the recovered private keys was the integer 4.
The company maintains that its infrastructure was not intruded, that no data was breached, that the incident does not affect its root CA private keys or other intermediates, that only one of the eight had been deployed in production, and that none of the eight — including that one — had issued any end-entity certificate. It has since left the SSL/TLS business. Whether anyone exploited the keys between April 2025 and October 2026 is not known, and the nature of the flaw means there would be nothing in eMudhra's logs to say either way: deriving a key from a published certificate leaves no trace at the CA.
What makes this incident instructive is the shape of the fix. Revocation is the mechanism the web has for exactly this, and it did not work. Chrome pushed its blocklist, Mozilla pushed OneCRL, and then the fixes had to be written into code — Go handled it on its URGENT track as CVE-2026-111943, rejecting any chain containing one of the eight keys, and removing emSign ECC Root CA - G3 from its bundle. Go's standard-library maintainer was blunt about why: Linux root stores are too poorly maintained for revocation to reach applications, so putting the keys in code was the only option. Anything that checks TLS without processing revocation data — a Go binary, anything using Python's certifi — keeps trusting a chain until its code or its bundle changes.
What we would have seen
CERT-TRUST-INTERMEDIATE-COMPROMISEDfires critical on a chain through any of the eight, matched by issuer and subject name pattern, with the public record of the block as the stated source.CERT-TRUST-POST-BLOCK-ISSUANCEescalates when the certificate's issuance date is after the block date — a certificate that should not exist, because no conforming CA would have signed it by then.CERT-TRUST-ROOT-DISTRUSTEDfires high foremSign ECC Root CA - G3andemSign Root TLS CA - G3, the roots pulled from the Mozilla, Chrome and Go bundles.- The ACM certificate transparency audit cross-references CT logs, which answers the question the trust-store change actually raises: not "is my certificate on a list" but "does anything I own chain through a poisoned issuer".
STALE_CERTIFICATEthen orders replacement by expiry.
What to do
- 01
Separate impersonation from expiry
Find anything that chains through the eight intermediates first — that is the impersonation case and it is urgent regardless of expiry. Then find what chains to the removed root; that is a scheduled outage you can plan, as long as you plan it before a client updates.
- 02
Look in certificate transparency, not just your inventory
Your inventory holds the certificates you know you have. CT logs hold the ones issued for your names, including by teams and vendors who did not tell you. For a CA incident, the second list is the one that matters.
- 03
Check the clients, not only the servers
Revocation did not reach applications here. Inventory what pins certificates or ships its own trust bundle — Go binaries, containers using
certifi, mobile apps, embedded devices — because each one trusts the chain until someone rebuilds it. - 04
Reissue from a CA still in the root programs
Replacement, not renewal: a renewal from the same issuer inherits the problem. Check your internal trust stores too, since a root removed from browsers may still be installed on your own machines.
eMudhra says none of the eight issued any end-entity certificate. Is there anything to do?
Our certificates come from a different CA. Does this affect us?
Why does revocation not solve this?
Was this an AI attack?
Run it in your own account
One Docker Compose stack, your datastores, read-only credentials into your clouds. The Community edition is free to run in production.