How weak keys at one certificate authority could have let anyone pretend to be any website, and how the internet fixed it in 72 hours.
A certificate authority's secret key should be a random number like this (116 digits):
In October 2026, someone found that one of eMudhra's secret keys was:
That is not a typo. Let's build up, from zero, why this one number put the whole web at risk.
Secret keys, public keys and signatures
Certificates and certificate authorities
What happens in the first milliseconds of every HTTPS connection
What eMudhra got wrong, and what an attacker could do with it
How Chrome, Firefox, Apple, Microsoft and open-source software un-trusted the keys
Before certificates, we need three ideas: a shared secret, a key pair, and a signature.
The internet is a chain of machines that pass your data along, like a bucket brigade.
Your message hops from machine to machine before it reaches the bank.
Every machine on the path can read it, copy it, or change it.
And any one of them could be an attacker. You cannot see which.
Nobody on the path can read the message.
Nobody can change the message without being caught.
You are talking to the real bank, not someone pretending to be the bank.
Encryption gives the first two. Certificates give the third. eMudhra's mistake broke the third, for every website.
You and the bank both hold the same secret key.
The key scrambles your message into nonsense.
Mallory sees only nonsense on the wire.
The bank uses the same key to unscramble it. This is fast and strong.
But how did the bank get the key? It had to travel over this same wire…
…and Mallory copied it. To share a secret safely, you first need a secret. Chicken and egg.
The bank makes two linked keys: a private key it keeps, and a public key that works like an open padlock.
It hands copies of the padlock to anyone who asks. Even Mallory. That is fine.
You put your message in a box and snap the bank's padlock shut.
The box crosses the wire. Mallory's padlock copy cannot open it.
Only the private key opens it. Public key locks; private key unlocks.
A signature proves who wrote something. The proof is only as safe as the private key.
Real keys use points on an elliptic curve. This toy works the same way, just much smaller.
Count 1 is the white spot 3. Each jump: multiply by 3, then wrap around 31.
3 → 9 → 27 → 19 → 26 → …
Everyone knows the start spot and the rule. They are public.
I secretly pick a count of 7.
After 7 counts I land on spot 17.
Private key: 7
Public key: 17
Knowing 7, finding 17 is quick. Computers have shortcuts (double, double, add), so even a 116-digit count takes well under a millisecond.
Someone sees only 17. What was the count? The spots look random, so the only way is to try:
With 30 spots, trying them all takes a second.
A real P-384 curve has about 39,402,006,196,394,479,212,279,040,100,143,613,805,079,739,270,465,446,667,946,905,279,627,659,399,113,263,569,398,956,308,152,294,913,554,433,653,942,643 spots.
If every atom in the universe were a computer guessing a billion keys a second since the Big Bang, together they would still not finish.
Unless the key is a small number. Then a laptop finishes before you blink.
Encryption hides the message. It does not tell you who is on the other end.
You ask the bank for its public key (its padlock).
Mallory keeps the bank's padlock and sends you her own instead. They look the same.
You lock your message with Mallory's padlock, believing it is the bank's.
Mallory opens it with her own private key and reads everything.
She re-locks it with the real bank padlock and passes it on.
Nobody notices. Encryption to the wrong person is worthless. We need proof that a public key really belongs to the bank.
The officer never met you, but trusts whoever made your passport. Your browser never met bank.com, but trusts whoever signed its certificate.
Every HTTPS website sends one to your browser. Let's open it.
The website names the certificate covers. Your browser compares this with the address bar. bank.com ≠ bank-secure-login.com.
The website's public key. The matching private key never leaves the bank's server. The server must prove it holds it.
Certificates expire, often after a few months. A short life limits the damage if something goes wrong.
The certificate authority that checked the website and signed this certificate.
The issuer signs all the fields above with its own private key. Change one letter of the name or key, and the signature no longer matches.
The CA's signature glues this name to this public key. Only the real website has the matching private key, so only it can use the certificate.
1. The server makes its own key pair. The private key never leaves the server.
2. It writes a request (a CSR): "Please certify that this public key belongs to www.bank.com."
3. The request goes to a certificate authority.
4. The CA sets a test that only the real owner of bank.com can pass.
5. The server passes the test. The CA's machines check it from outside.
6. The CA signs the certificate with the CA's private key and sends it back.
7. The server installs it and shows it to every visitor. With ACME automation, all of this takes seconds.
Confirm the requester really controls the domain (and, for OV/EV, really is that company).
Seal the certificate with the CA's private key, so browsers will accept it.
Create signing keys correctly and keep them locked in special hardware. Everything depends on this.
Revoke bad certificates and publish lists of cancelled ones.
Log every certificate in public, and pass yearly audits to stay trusted.
CAs sell this as a business. Website owners pay (or use a free CA like Let's Encrypt). Browsers decide which CAs to trust.
eMudhra failed at job 3: the keys were not created correctly.
Google buys its certificate from one CA. But that is not a rule the browser checks…
…every trusted CA is technically able to sign a certificate for every website name.
So the whole web is only as strong as the weakest CA on the list. One broken CA key is a master key.
Firefox. Its list is also copied by Linux and many apps and libraries.
Chrome Root Store, used by Chrome on all platforms and by Android.
iPhone, iPad, Mac, Safari.
Windows, Edge and Windows apps.
Each device ships a list of trusted "root" certificates. To stay on it, a CA must follow shared rules (the CA/Browser Forum Baseline Requirements) and pass audits every year. eMudhra's emSign ECC Root CA - G3 was on these lists.
offline, in a vault · lives 20–25 years
in your browser's trusted list
online · signs certificates every day
lives a few years
the "leaf" certificate
lives a few months
public key R · built into browser
public key I · signed by Root
public key B · signed by Intermediate
The browser checks maths, not honesty. Anyone holding the intermediate's private key can make these checks pass.
What your browser and a website say to each other in the first 50 milliseconds of every HTTPS connection (TLS 1.3).
First the browser asks DNS, the internet's phone book, for bank.com's address.
Then TCP opens a reliable pipe with three tiny packets. Nothing is secret yet.
The very first TLS message is the ClientHello. Here the security conversation begins.
With HTTP/3, the pipe uses QUIC instead of TCP, but the same TLS 1.3 messages travel inside it.
The browser's opening message. Let's read it line by line.
Which TLS versions I speak. Today, almost always TLS 1.3.
32 fresh random bytes. They make every handshake unique, so old messages can't be replayed.
The bulk-encryption methods I support, best first. The server will pick one.
Which website I want. One server can host thousands of sites; this tells it which certificate to send.
The key-exchange maths I support. Newer browsers include a post-quantum mix (X25519MLKEM768).
The browser has already made a fresh key pair and sends its public half now. This saves a whole round trip.
Which signatures I can check. The server's certificate must use one of these.
The ClientHello is not encrypted. Anyone on the path can read it. That is fine: it contains only public things.
Start with a paint colour everyone knows. It is public.
Each side secretly picks its own colour. Secrets never leave home.
Each side mixes its secret into the public paint. Mixing is easy.
They swap the mixtures in public. Mallory sees both.
Each adds its own secret to what it received. Both get the same brown!
Un-mixing paint is hard. Mallory saw everything but cannot make the brown.
In real life: paint = point G · secrets = a, b · mixes = A = a×G, B = b×G · brown = a×b×G. This is Diffie–Hellman key exchange.
The server picks from the browser's lists.
We will speak TLS 1.3.
The server's own 32 fresh random bytes.
The one bulk-encryption method both sides will use: AES-128 in GCM mode.
The server's fresh public key, made from its secret b. Now both sides have what they need.
Both sides can already compute the shared secret. The rest of the handshake, including the certificate, travels encrypted.
knows a, received B
a × B = a × b × G
knows b, received A
b × A = b × a × G
Same number on both sides, and it never crossed the wire.
A key-derivation function stirs the shared secret with a fingerprint of the conversation.
Out come the session keys: one for each direction.
Mallory has only A and B. To get the secret she must go backwards from A to a. With real-size numbers, she can't.
Your browser wants to send a normal web request.
It encrypts the request with the browser → server session key.
On the wire it is noise, plus a short "tag", a tamper seal made with the key.
The server decrypts it and checks the tag. ✓
If anyone changes even one bit, the tag check fails and the connection is closed.
Secrecy ✓ Integrity ✓. Symmetric keys do the heavy lifting because they are very fast.
Your ClientHello reaches Mallory instead of the bank.
She answers with her own key share M, as if she were bank.com.
You now share a perfect secret… with Mallory. She makes a second one with the bank.
Key exchange gives secrecy with whoever answered. It says nothing about who answered. This is where certificates come in.
A signature, made with bank.com's private key, over a fingerprint of everything said so far: both Hellos, A, B, and the certificates.
The server sends its certificate chain. This is the first moment the CA's work enters the conversation.
Then it signs the whole conversation, including the key shares, with its private key.
The browser checks all three. So the key share B really came from whoever holds bank.com's private key.
Finally, each side sends "Finished": a checksum of the whole handshake. Then the padlock appears.
Mallory can't sign as bank.com… unless a trusted CA gives her a certificate for bank.com with a key she owns.
{ } = encrypted with handshake keys · [ ] = encrypted with session keys · about 50 ms in total.
Everything secret was set up by the key exchange. Everything about who rests on two violet lines, and they rest on a CA.
Now we have every piece. Here is what happened at eMudhra, and why it mattered for everyone.
Indian digital-trust company, listed on Indian stock exchanges. Brand name: emSign.
Certificate companies in India, the US and the Netherlands.
Licensed CA for digital signature certificates and Aadhaar-based eSign, under India's Controller of Certifying Authorities.
digital certificates issued, by its own count.
of revenue comes from website (TLS) certificates worldwide.
big root programs trusted its roots: Mozilla, Chrome, Apple, Microsoft.
A small part of their business. But inside your browser's trust list, a small CA has exactly the same power as the biggest one.
eMudhra's weak keys: 47 bytes of zero, then one small byte.
Values published by researchers. Every one is below 256: it fits in a single byte.
One byte = 256 possibilities. A combination lock with 256 settings, guarding certificates for the whole web.
Anyone can download any certificate. Its public key is right there.
The attacker's plan: compute k × G for k = 1, 2, 3, … and compare with the public key. A match means k is the private key.
This page is doing real P-384 elliptic-curve maths with your device's CPU.
"One of eMudhra's certificate authority private keys is the number 4."
"The key was effectively public from the day the certificate existed."
Each intermediate also had a twin certificate, cross-signed in May 2025 by Sectigo's older "AAA Certificate Services" root. Same key.
None of these sites ever used eMudhra.
It does not matter. These intermediates had no name limits, so one key could sign a certificate for any of them.
Passwords, OTPs and session cookies, behind a normal-looking padlock.
Swap a bank account number in a payment, or edit a download.
Server-to-server and app-to-API traffic, where no human ever sees a warning.
The two code-signing keys could make malware look like it came from a real publisher.
Any service that trusts these roots for TLS: email, VPNs, internal tools.
Phones, TVs, routers and IoT gear that never update keep trusting these keys for years.
For about 17½ months, anyone who looked could have computed these keys.
Anyone can check these 8 signatures with the public keys in the certificates. Only the private-key holder could have made them.
intermediates revoked: eMudhra's own, plus Sectigo's cross-signed twins.
emSign ECC Root CA - G3 removed by Mozilla, with Chrome to follow.
customer certificates under that root must be replaced.
eMudhra estimateeMudhra share price on 21 Oct.
Indian government responses: a CERT-In advisory and a MeitY investigation team.
Google is also evaluating eMudhra's other root, emSign Root CA - G1.
eMudhra and India's IT ministry say Indian digital-signature and eSign services are separate and were not affected.
How do you un-trust a key that is already inside billions of devices?
eMudhra revoked the eight intermediates and listed them in its cancelled list (CRL).
Software can also ask the CA live (OCSP): "is this certificate still good?"
But an attacker in the middle can simply block the question.
Most software "fails open": no answer means carry on. And many apps never ask at all.
So browser makers built their own block lists, pushed straight into the browser.
A small block list Google pushes to every Chrome in the background. Android got a block via Google Play services.
OneCRL blocks CA certificates. CRLite packs every revoked certificate into a tiny file.
Blocks for iPhone, iPad, Mac and Safari.
Windows "untrusted" list, delivered through automatic trust-list updates.
Browsers: protected within hours to days, mostly without users doing anything.
Browsers update themselves. Everything else waits for someone to ship, and someone else to install, an update.
verify=False, curl -k or InsecureSkipVerify.Every padlock rests on a secret number.
For 17½ months, one of them was 4.
Thank you. Questions?
| → Space PgDn or click | next step |
| ← PgUp | previous step |
| ↓ / ↑ | next / previous slide |
| Home / End | first / last slide |
| F | full screen |
| N | speaker notes |
| ? / Esc | show / hide this help |