The eMudhra CA Key Compromise: What It Means for Your Business

Your browser was fixed in two hours. Your servers, scripts and devices may still trust forged certificates

Featured image

Every time your laptop, your payment gateway integration or your accounting app connects to a server over HTTPS, it asks one question: is this certificate signed by someone I trust? That trust is outsourced to a few hundred certificate authorities (CAs). This month one of them, India’s eMudhra, turned out to have published eight intermediate CA certificates whose private keys were so weak that one of them was literally the number 4.

Anyone holding those keys could have issued a certificate for any website (your bank, your payment provider, your Microsoft 365 tenant) that a large share of software would have accepted. Browser makers fixed it within hours. The harder problem is everything that isn’t a browser: servers, scripts, Java applications, containers, routers and printers. That is where most businesses still have homework to do.

TL;DR / Key takeaways

  • What happened: Private keys for eight eMudhra intermediate CAs (six for websites, two for code signing) were generated with almost no randomness and could be computed from the public certificates in under a second. They were created in April 2025, so they were effectively public for about 17 months.
  • Browsers are protected: Chrome, Firefox, Apple, Microsoft and Android blocked the certificates between 17 and 20 October 2026. Chrome found no website certificates issued from these CAs in public Certificate Transparency logs.
  • Non-browser software is the risk: Many apps, scripts, Java runtimes, containers and devices don’t check revocation or Certificate Transparency. They stay exposed until their own trust store is updated.
  • Possible breakage: Some vendors removed the eMudhra root entirely, and eMudhra announced on 22 October that it is leaving the global SSL/TLS business. If your sites use eMudhra TLS certificates, replace them now.
  • Do this week: Update OS trust stores and runtimes, rebuild container images, test your applications against the public test hosts, and replace any eMudhra-issued TLS certificates.

What happened, in plain language

A certificate authority’s job is to keep a secret: its private key. Whoever has that key can create certificates that software trusts. In this case, eMudhra didn’t lose its keys to hackers. The keys were weak from the moment they were made.

According to eMudhra, a bug in the script used during its 30 April 2025 key-generation ceremony created a second, weak key pair on its hardware security module, and a human error meant those weak keys were the ones used. The resulting certificates were cross-signed by Sectigo’s legacy AAA Certificate Services root in May 2025, which widened the set of software that would trust them.

How weak? Researcher Scott Helme explains that a P-384 private key should be a random 384-bit number. These keys were single-byte values such as 4, 56 and 115. Recovering one means trying, at most, 255 possibilities. He recovered all of them in under a second. Mozilla independently recovered the keys within two hours of the report.

The affected intermediates are:

Timeline

Date (2026, UTC) Event
30 Apr 2025 Weak intermediate keys generated during eMudhra key ceremony
May 2025 Intermediates cross-signed by Sectigo’s AAA Certificate Services root
17 Oct, 18:05 Chrome Root Program receives the report; CRLSet block live by 19:45
17 Oct, 20:06 Mozilla receives the report; OneCRL block complete by 22:59
19 Oct Apple blocks the certificates; Android protected via Google Play Services; Cloudflare learns of the issue
20 Oct Public disclosure. Microsoft blocks; Mozilla removes emSign ECC Root CA - G3 from NSS; Go, Firefox, Ubuntu and Debian ship fixes
21 Oct Node.js fixes; CERT-In advisory CIAD-2026-0050; Red Hat RHSB-2026-012; India’s MeitY forms an investigation team
21-22 Oct Azul ships Java runtime updates
22 Oct eMudhra announces it will exit the global SSL/TLS certificate business
27 Oct Scheduled removal of emSign ECC Root CA - G3 from the Chrome Root Store

Was anyone actually attacked?

As far as public evidence goes, no confirmed malicious use has been reported. Google says no TLS certificates chaining to these CAs were logged to Certificate Transparency before the block. Cloudflare found no active exploitation against its services. CERT-In said on 21 October that public disclosures did not establish confirmed malicious use, and MeitY described the impact on Indian websites as “very limited and for a very short interval.”

But “no evidence” is not “no risk”. Helme makes the important point: Certificate Transparency detects mis-issuance, it doesn’t prevent it. A forged certificate used in a targeted attack against software that doesn’t check CT would never need to be logged publicly. With a 17-month window, nobody can prove it didn’t happen.

Why browsers are fine but your business may not be

Browsers have fast, centralised kill switches (Chrome’s CRLSets, Firefox’s OneCRL) and they enforce Certificate Transparency. Most other software has neither. As Helme puts it, most non-browser TLS clients trust whatever CA bundle is on disk, skip revocation checks and skip CT.

In his testing, curl, Python and Node.js on Linux and macOS accepted a forged certificate for api.stripe.com chained to one of the compromised intermediates. On Windows, CryptoAPI accepted it unless revocation checking was turned on. Azul notes that Java runtimes “do not check certificate revocation by default”.

Translate that into business systems and the exposure looks like this:

An attacker would still need to be in a position to intercept traffic (a compromised network, a malicious Wi-Fi hotspot, a hijacked DNS record or upstream provider). That is a real bar, but it’s exactly the kind of position state-sponsored groups and serious criminals routinely obtain.

Am I affected?

You have work to do if any of these are true:

  1. You run Linux servers, containers or developer machines whose ca-certificates package, Python certifi, Node.js, Go or Java runtime hasn’t been updated since 20 October.
  2. You build and ship software (especially in Go, which embeds the check at compile time and needs a rebuild, or Electron apps).
  3. You run Java applications, whether in-house or vendor-supplied, unless the JDK vendor has shipped an update.
  4. You use macOS for development. Dennis Jackson’s tracking page reports no macOS patch is listed yet and that built-in tools such as curl, git and Python still trust the certificates.
  5. Your websites or APIs use certificates issued by eMudhra/emSign. Chrome removed emSign ECC Root CA - G3 and other platforms have removed roots, so visitors may start seeing errors. eMudhra says it will replace affected certificates free of charge.
  6. You rely on network appliances, IoT or embedded devices that make outbound HTTPS calls and rarely get firmware updates.

Quick check for your own websites (who issued my certificate?):

~|#| Replace example.com with your domain. Look for "eMudhra" or "emSign" in the issuer.
openssl s_client ~|-|connect example.com:443 ~|-|servername example.com ~|<|/dev/null 2>/dev/null \
  | openssl x509 ~|-|noout ~|-|issuer ~|-|enddate

Quick check for your software (does this client still trust the bad chain?). The independent disclosure site publishes test hosts. Run this from the real environment (the server, container or CI runner), not your laptop:

~|#| A certificate ERROR is good: the client rejects the compromised chain.
~|#| A successful connection means this environment still trusts it.
curl ~|-|sS ~|-|o /dev/null https://dv~|-|g3b~|-|emudhra.we~|-|have~|-|a~|-|problem.com/ && echo "STILL TRUSTS (fix needed)"
curl ~|-|sS ~|-|o /dev/null https://dv~|-|g3b~|-|aaa~|-|emudhra.we~|-|have~|-|a~|-|problem.com/ && echo "STILL TRUSTS via AAA cross~|-|sign (fix needed)"
~|#| Same test from Python, which uses certifi in many apps:
python3 ~|-|c "import urllib.request as u; u.urlopen('https://dv~|-|g3b~|-|emudhra.we~|-|have~|-|a~|-|problem.com/'); print('STILL TRUSTS (fix needed)')"

The site also offers noct variants that serve certificates never logged to Certificate Transparency. If those connect successfully, the client trusts the chain and doesn’t enforce CT.

Inventory checks on Linux and Windows:

~|#| Linux: should return 0 after the ca~|-|certificates update
grep ~|-|c "emSign" /etc/ssl/certs/ca~|-|certificates.crt

~|#| Python: certifi must be 2026.10.19 or later
python3 ~|-|c "import certifi, importlib.metadata as m; print(m.version('certifi'), certifi.where())"

~|#| Find bundled CA files hiding inside apps and images
find / ~|-|xdev \( ~|-|name "cacert.pem" ~|-|o ~|-|name "ca~|-|bundle.crt" ~|-|o ~|-|name "cacerts" \) 2>/dev/null
~|#| Windows: list eMudhra/emSign roots and intermediates present in machine stores
Get~|-|ChildItem Cert:\LocalMachine\Root, Cert:\LocalMachine\CA |
  Where~|-|Object { $_.Subject ~|-|match "emSign|eMudhra|EM (DV|OV|EV) TLS|EM OV CS" } |
  Select~|-|Object PSParentPath, Subject, Thumbprint, NotAfter

Fixed versions to look for

Component Fixed in
Go 1.27.3, 1.26.10 (CVE-2026-111943; rebuild your binaries; 1.25 and older get no fix)
Node.js 26.12.1, 24.22.1, 22.23.4
Python certifi 2026.10.19
Firefox 158.0.1, ESR 115.43.1, ESR 153.5.1
NSS 3.131.1
Rust webpki-roots 1.0.10
PHP Composer ca-bundle 1.6.0, 1.4.16
Ubuntu / Debian USN-8944-1/-2; DSA-6572-1
Red Hat Enterprise Linux RHSB-2026-012 (workaround for RHEL 7+)
Azul Zulu / Prime (Java) Out-of-cycle builds released 21 October
Cloudflare cloudflared 2026.10.2 (plus updated WARP / 1.1.1.1 clients)

Some projects were still pending at the time of writing, including OpenJDK upstream and certbot, according to the community tracker. Check it for your stack before assuming you’re covered.

A prioritised action plan

Immediately (today)

This week

Longer term

OffensioX perspective

The striking thing about this incident isn’t the bug. It’s how unevenly the internet recovered. Browser vendors pushed protection to billions of users in a few hours, without a restart. Meanwhile, the software that actually moves money and data between businesses (API clients, Java middleware, build pipelines, embedded devices) is still being patched one package at a time, and some of it never will be.

For businesses in Pakistan and across South Asia, there are two practical lessons. First, the “trust layer” is part of your supply chain, just like npm packages or a third-party plugin, and most organisations have never inventoried it. Second, regional providers are increasingly part of the global trust fabric, so an incident at one vendor ripples everywhere at once. It’s also worth noting that the problem was found by outside researchers, not by audits: eMudhra says its roots and issuing CAs passed independent audits two years running. Compliance checkboxes are not the same as adversarial testing.

If you want a clear picture of which of your applications, servers and integrations would accept a forged certificate, OffensioX can help through penetration testing and security assessments that test what your systems actually trust, not just what the configuration says.

References