The eMudhra CA compromise: eight keys anyone could recover.
On 17 October 2026 a researcher reported that eight intermediate certificate authorities created by eMudhra in April 2025 had private keys generated with almost no randomness — small enough to recover from the public certificates in moments. Browsers blocked them within hours. Java, Node.js, Go, Python and every major Linux distribution followed. Anything that carries its own copy of the trust store is still on its own.
SE
SemperWise Security Engineering·
14 min read
·
Vulnerability Intelligence
8CA keys, every one below 256
16Certificates blocked, with cross-signs
18 monthsApril 2025 to October 2026
27 OctChrome removes the root
What happened
At 18:05 UTC on Saturday 17 October 2026, a researcher who signs as “Wayne” emailed Apple, Chrome, Microsoft, Mozilla and eMudhra with evidence that the private keys behind eight eMudhra intermediate CA certificates could be recovered. He later said he found them by running Google’s open-source paranoid_crypto checks across the public corpus of CA certificates.
Mozilla’s description of the flaw is stark: “P384 private keys are randomly selected integers between 1 and the group order. The 8 impacted keys all used integers less than 256. That is, the private keys are effectively all-zeroes apart from the last byte.” Mozilla recovered them independently within two hours of receiving the report. CERT-In adds the point that matters for anyone worried about elliptic-curve cryptography itself: the weakness “arose during key generation and does not indicate a vulnerability in the P-384 cryptographic algorithm itself.”
All eight came from a single key-generation ceremony on 30 April 2025. eMudhra’s preliminary explanation is that a key wrap/unwrap step “produced a second, weak set of keys alongside the original strong keys”, and that the weak set was used to create the certificate requests “because the key labels were similar”. eMudhra says it has “not yet confirmed the exact root cause”, and as of 23 October it had not answered the formal questions Mozilla sent on 20 October.
The certificates involved
Intermediate CA
Purpose
Operated by
EM DV TLS CA - G3B
TLS
eMudhra BV (NL)
EM OV TLS CA - G3B
TLS
eMudhra BV (NL)
EM EV TLS CA - G3B
TLS
eMudhra BV (NL)
EM DV TLS CA - G3C
TLS — the only one in production
eMudhra Inc (US)
EM OV TLS CA - G3C
TLS
eMudhra Inc (US)
EM EV TLS CA - G3C
TLS
eMudhra Inc (US)
EM OV CS CA - G3B
Code signing (trusted by Microsoft)
eMudhra BV (NL)
EM OV CS CA - G3C
Code signing (trusted by Microsoft)
eMudhra Inc (US)
Each was issued by eMudhra’s emSign Root TLS CA - G3 or emSign Root CS CA - G3, and each was also cross-signed by Sectigo’s AAA Certificate Services in May 2025 — sixteen certificates over eight keys. eMudhra says none of the eight issued an end-entity certificate.
How the industry responded
When (UTC)
What happened
17 Oct, 18:05
Report reaches the browser root programs and eMudhra
17 Oct, 19:45
Chrome ships a CRLSet blocking the six TLS keys — which also covers the Sectigo cross-signs
17 Oct, 22:59
Firefox’s OneCRL block reaches standard installs, “in less than 3 hours after we received the report”
18 Oct, 09:24–09:38
eMudhra revokes its eight certificates
19 Oct
Sectigo revokes its eight cross-certificates. Microsoft’s published disallowed-certificate list gains an entry for each key. Go 1.27.3 and 1.26.10 ship a key denylist (CVE-2026-111943). Android receives a block through Google Play Services
20 Oct
Mozilla announces the emergency removal of emSign ECC Root CA - G3 (NSS 3.131.1). Firefox 158.0.1 and ESR releases bake the block in (CVE-2026-113470). Debian (DSA-6572-1) and Ubuntu (USN-8944-1) update ca-certificates. eMudhra stops issuing under the ECC G3 root
21 Oct
Node.js releases with a compiled-in key blocklist. Oracle issues Security Alert CVE-2026-91403 for Java. CERT-In publishes advisory CIAD-2026-0050
22 Oct
eMudhra announces it will withdraw from the global SSL/TLS certificate business. Electron publishes its fix (CVE-2026-115570)
27 Oct
Chrome Root Store v43, without emSign ECC Root CA - G3, expected to reach all Chrome users
Sources: Google, Mozilla (blog, Bugzilla 2083449, MFSA 2026-111), eMudhra, Microsoft’s published disallowed-certificate list, Go, Node.js, Oracle, Debian, Ubuntu, CERT-In.
Removing the root is the step with collateral damage. Chrome’s analysis of Certificate Transparency logs found roughly 30,800 unexpired certificates chaining to emSign ECC Root CA - G3, 99.9% of them issued through two Internet2 / InCommon subordinate CAs serving US research and education. Those sites already fail in clients built on NSS 3.131.1 — Debian, Ubuntu, Red Hat, Python’s certifi, Node.js — and will fail in Chrome from 27 October unless they replace their certificates.
Where each platform stands
Platform
Protected from
How
Chrome / Android
17 Oct / 19 Oct
CRLSet and Play Services blocks; root removed in Chrome Root Store v43 (27 Oct)
Firefox / Thunderbird
17 Oct (remote) · 158.0.1, ESR 153.5.1, ESR 115.43.1
OneCRL; the block is built in for installs with remote settings disabled
Windows
19–20 Oct
Disallowed-certificate list, through automatic updates. Microsoft has published no advisory; the entries are visible in its published list file
Apple platforms
Not confirmed
No Apple statement found as of 24 October; reports of the date conflict
System trust store drops emSign ECC Root CA - G3 (Debian and Ubuntu ESM also drop Sectigo’s AAA root)
Go, Node.js and Mozilla use byte-identical lists of the eight key hashes. Versions are the first fixed release on each line.
Java: CVE-2026-91403, and the update you had to apply twice
Oracle’s quarterly Critical Patch Update arrived on 20 October with 55 Java SE fixes, 49 of them remotely exploitable without authentication. The next day Oracle issued an out-of-band Security Alert, CVE-2026-91403 — CVSS 3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N) in JSSE, Java’s TLS implementation — higher than anything in the scheduled update.
The awkward detail: the builds released on 20 October — 8u511, 11.0.33, 17.0.21, 21.0.13, 25.0.5 and 27.0.1 — are themselves listed as affected. Anyone who patched promptly on 20 October had to patch again on 21 October, to 8u511 b32 or the x.0.2 builds.
Oracle’s fix adds all sixteen certificates to lib/security/blocked.certs (blacklisted.certs on JDK 8) and leaves the root certificates in place. OpenJDK goes further, asking users of standalone runtimes to act “even if you have already updated”: delete the emsigneccrootcag3 [jdk] and comodoaaaca [jdk] entries from the bundled cacerts, or enable revocation checking. OS-packaged OpenJDK on Red Hat, Fedora and similar distributions uses the system trust store and is fixed by the ca-certificates update; on Debian and Ubuntu the Java keystore may need rebuilding.
Java runtimes
# Which Java, and does its trust store still carry the affected roots?
java -version # Oracle: want 8u511 b32, 11.0.33.0.2, 17.0.21.0.2, 21.0.13.0.2, 25.0.5.0.2, 27.0.1.0.2+
keytool -list -cacerts -storepass changeit \
| grep -i -E 'emsigneccrootcag3|comodoaaaca|emsign_ecc_root_ca_-_g3|comodo_aaa'
# OpenJDK's guidance for standalone runtimes (JDK 11+), then restart the JVM
keytool -delete -cacerts -storepass changeit -alias "emsigneccrootcag3 [jdk]"
keytool -delete -cacerts -storepass changeit -alias "comodoaaaca [jdk]"
# Debian / Ubuntu: rebuild the Java keystore after updating ca-certificates
sudo rm -f /etc/ssl/certs/java/cacerts && sudo update-ca-certificates --fresh
# Or enable revocation checking (Oracle's documented alternative)
java -Dcom.sun.net.ssl.checkRevocation=true -Dcom.sun.security.enableCRLDP=true ...
One caution before deleting Sectigo’s AAA root everywhere: some certificate authorities still serve cross-certificates that chain up to it, so very old clients without the newer roots can fail on otherwise healthy sites. Test after the change, as the community tracker for this incident also warns.
India: what is and is not affected
eMudhra is one of India’s licensed certifying authorities, and the obvious first question for Indian organisations is whether Digital Signature Certificates and eSign are touched. They are not. CERT-In’s advisory is explicit: “The issuance of digital signature certificates and eSign services, regulated by the Controller of Certifying Authorities (CCA) under MeitY are not impacted.”
The reason is structural. The compromised intermediates sit under eMudhra’s globally trusted emSign roots and Sectigo’s AAA root — the web PKI that browsers use — not under the CCA’s Root Certifying Authority of India. The two hierarchies are separate, audited separately, and the incident is confined to the first.
What does affect Indian organisations is eMudhra’s decision, announced on 22 October, to withdraw from the global SSL/TLS business. eMudhra says its RSA (G1) roots will keep serving customers during the transition and that revocation services will run until every certificate has expired or been replaced, and it is offering Sectigo-issued certificates to customers. Chrome has said it is “closely investigating” eMudhra’s remaining roots. Any site on an emSign TLS certificate should plan a move now rather than on someone else’s deadline.
Who is still exposed
Google notes that because no certificate from the six TLS intermediates appeared in Certificate Transparency logs before the block, “no fraudulent certificates issued by these CAs could have been used against CT-enforcing clients” — which means browsers. Most other software does not enforce CT, and that is where the exposure lives:
Servers and scripts using OpenSSL, curl or GnuTLS with a system trust store that has not been updated.
Java runtimes older than the 21 October builds, and Debian or Ubuntu Java keystores that were never rebuilt.
Python environments with certifi older than 2026.10.18, including pip vendored inside old virtual environments.
Node.js below 22.23.4, 24.22.1 or 26.12.1 — and every end-of-life Node.js line, which gets no fix.
Go programs built with a toolchain older than 1.26.10 or 1.27.3. Updating Go on the build machine changes nothing until each binary is rebuilt and redeployed.
Electron desktop apps until each vendor ships an update built on a fixed Electron.
Container images, appliances, IoT devices and firmware with a CA bundle baked in.
Windows machines that do not receive automatic certificate-list updates — air-gapped or locked-down hosts — including for code signing, where Windows still trusts eMudhra’s code-signing root.
Was anyone attacked? CERT-In’s position on 21 October was that public disclosures “do not establish confirmed malicious exploitation of the affected keys.” For clients that do not enforce Certificate Transparency, misuse between April 2025 and October 2026 can be neither confirmed nor ruled out — which is the reason to treat the clean-up as urgent rather than theoretical. A community test site referenced by Mozilla recorded tens of thousands of successful connections in a few hours from clients that still trust the compromised intermediates — monitoring agents, curl, Python and pip among the most common.
How to check your own systems
Does this machine still trust the compromised chain?
Clients and runtimes
# Live test against the community test hosts: an ERROR is the good result
curl -sS -o /dev/null https://dv-g3b-emudhra.we-have-a-problem.com/ && echo "STILL TRUSTS (vulnerable)"
curl -sS -o /dev/null https://dv-g3b-aaa-emudhra.we-have-a-problem.com/ && echo "STILL TRUSTS via the Sectigo cross-sign"
# The system trust store (Debian/Ubuntu path shown)
openssl storeutl -noout -text -certs /etc/ssl/certs/ca-certificates.crt \
| grep -E 'Subject:.*(emSign ECC Root CA - G3|AAA Certificate Services)'
dpkg -l ca-certificates 2>/dev/null | awk '/^ii/{print $2, $3}' # or: rpm -q ca-certificates
# Python: want certifi >= 2026.10.18 and pip >= 26.2.2
python3 -c "import certifi; print(certifi.__version__)"; python3 -m pip --version
# Node.js: version, then whether the bundled roots are still present
node -p process.version
node -p "tls.rootCertificates.filter(c=>/emSign ECC Root CA - G3/.test(new crypto.X509Certificate(c).subject)).length"
# Go: the toolchain, and the toolchain each deployed binary was built with
go version; go version /path/to/binary
A note on that Node.js check: the simpler /emSign/.test(pem) form that has circulated always returns zero, because it searches the base64 text of the certificate rather than its decoded subject. Patched Node.js releases block the eight keys regardless of what the root list says.
Is your website’s certificate affected?
Since the compromised intermediates issued no customer certificates, the realistic finding for a site owner is not a compromised certificate but one that chains to emSign ECC Root CA - G3 — the root being removed. Google’s instruction to those operators is that they “must immediately acquire and install a new TLS certificate from another PKI hierarchy included in the Chrome Root Store”. ACME clients will not renew on their own outside the renewal window, so force the renewal.
Your servers
# Every certificate a server presents, with subject and issuer
H=www.example.com
openssl s_client -connect "$H:443" -servername "$H" -showcerts </dev/null 2>/dev/null \
| openssl crl2pkcs7 -nocrl -certfile /dev/stdin | openssl pkcs7 -print_certs -noout
# Act on any of these in the output:
# issuer "EM DV|OV|EV TLS CA - G3B|G3C" -> a compromised intermediate (should never appear)
# "emSign ECC Root CA - G3" or "emSign Root TLS CA - G3" in the path -> replace before 27 October
# "InCommon ... OVG3C|DVG3C", "EM EV|OV TLS CA - G3A-1", "emSign ECC (EV )SSL CA - G3"
# -> also chains to the removed root
Code signing
eMudhra says its two code-signing CAs never issued a certificate, so a signature chaining to EM OV CS CA - G3B or G3C would be anomalous and worth escalating. On Windows, signtool verify /pa /v /all prints the full signing chain; on Linux, osslsigncode verify does the same; for Java archives, jarsigner -verify -verbose -certs -strict — and Oracle notes that strict verification now fails for anything signed through these chains.
What to do
Update trust stores and runtimes.
Operating-system ca-certificates, browsers, Java (to the 21 October builds), Node.js, Python’s certifi and pip, and Electron-based apps as vendors ship them.
Rebuild what carries its own trust.
Container images, Go binaries and appliance firmware do not inherit the host’s fix. Rebuild from updated bases and redeploy.
Replace certificates under emSign ECC Root CA - G3 before 27 October.
Chrome’s root removal turns those sites into errors for most of the web. Clients built on NSS 3.131.1 already reject them.
Plan the move off emSign entirely.
eMudhra is leaving global TLS. Migrating on your own schedule is cheaper than migrating on a distrust announcement.
Turn on what would have caught this.
Certificate Transparency enforcement where your clients support it, revocation checking where practical, and CT monitoring for certificates issued for your domains by issuers you do not use.
How SemperWise helps
Every certificate chain you expose
Attack-surface discovery finds your internet-facing hosts from certificate transparency and DNS, and external testing inspects the chain each one presents — so a forgotten host on an emSign ECC G3 certificate surfaces before Chrome turns it into an error page.
Runtimes that bring their own trust
The optional Sentinel agent’s software inventory lists the Java, Node.js and Python runtimes on each machine it watches — the starting list for this clean-up. Node.js below the fixed releases is already raised as a finding.
Trust-store patches read from the source
A credentialed patch audit checks installed packages against your distribution’s own advisories, so a host missing the Debian, Ubuntu or Red Hat ca-certificates update shows up as unpatched rather than looking current.
Built for India’s two PKIs
We separate what touches the CCA hierarchy — DSC and eSign — from what touches the web PKI, so the remediation plan goes to the teams that own each, and nobody re-issues signing tokens that were never affected.
Are Indian Digital Signature Certificates and eSign affected?
No. CERT-In’s advisory CIAD-2026-0050 states that digital signature certificates and eSign services regulated by the Controller of Certifying Authorities under MeitY “are not impacted”. The compromised intermediates belong to eMudhra’s separate, globally trusted emSign web PKI and Sectigo’s cross-signs, not the CCA hierarchy.
Was anyone attacked using these keys?
No confirmed exploitation has been reported. Google says certificates from the compromised TLS intermediates could not have been used against clients that enforce Certificate Transparency, which covers the major browsers. Software that does not enforce CT — much of the non-browser world — cannot be shown either way for April 2025 to October 2026, which is why updating trust stores and runtimes matters.
Our website uses an eMudhra certificate. What should we do?
Check the chain your server presents. If it runs through emSign ECC Root CA - G3, replace the certificate with one from another trusted CA before Chrome removes that root on 27 October 2026; many Linux clients already reject it. If it chains to eMudhra’s RSA G1 root, it remains trusted for now, but eMudhra is leaving the global TLS business, so plan a migration.
We updated Java on 20 October. Are we covered?
No. The 20 October builds (8u511, 11.0.33, 17.0.21, 21.0.13, 25.0.5, 27.0.1) are listed as affected by CVE-2026-91403. Move to 8u511 b32 or the x.0.2 builds released on 21 October. OpenJDK also recommends removing the emsigneccrootcag3 [jdk] and comodoaaaca [jdk] roots from standalone runtimes, or enabling revocation checking.
Why do browsers reject these certificates when our applications do not?
Browsers receive revocation updates continuously and enforce Certificate Transparency. Most applications rely on a trust store — the operating system’s, or one bundled with Java, Python, Node.js, Go or the application itself — that only changes when that component is updated or rebuilt. Each copy has to be fixed separately.
Works the applied side of security architecture — cryptography, cloud infrastructure and secure design — and writes up what the engagement work is teaching us.