If you already reworked your platform's ACME automation for Let's Encrypt's 6-day short-lived certificates, here's the bad news: that wasn't the last certificate migration on the calendar. On June 3, 2026, Let's Encrypt committed to a second one — Merkle Tree Certificates (MTCs) — and the reason it's happening at all is a number worth sitting with. A direct swap of today's TLS signatures for NIST-standardized ML-DSA ones would push a single handshake from roughly 1,248 bytes past 14,700 bytes. Let's Encrypt's alternative, MTCs, gets that back down to about 736 bytes — smaller than today's classical handshake, despite being quantum-resistant. That's the number that explains everything else in this post: why a straight algorithm swap was never on the table, and why what replaces it changes the shape of your ACME automation, not just the size of your certificates.
Why you can't just swap the algorithm
Today's TLS handshake authenticates a connection with roughly five signatures and two public keys spread across the leaf certificate, its CertificateVerify, an intermediate signature, and a couple of Certificate Transparency SCTs. Under classical algorithms that's cheap: an ECDSA-P256 signature is 64 bytes, and so is an ECDSA-P256 public key. Multiply that out and you get a handshake in the neighborhood of 1,248 bytes of authentication data — small enough to fit inside a single TCP round trip without anyone noticing.
NIST's ML-DSA-44 does the same job under a lattice-based scheme that survives a quantum adversary, but it isn't a drop-in replacement at the byte level:
| Signature size | Public key size | |
|---|---|---|
| ECDSA-P256 (classical) | 64 bytes | 64 bytes |
| ML-DSA-44 (post-quantum) | ~2,420 bytes | 1,312 bytes |
Swap those into the same five-signature, two-key handshake shape and the math stops being subtle: the total climbs past 14,700 bytes — an order of magnitude larger than what runs today. Let's Encrypt's own research (echoing work Cloudflare has published on post-quantum handshake size) found that handshakes at that scale measurably fail on real-world networks: some connections don't survive the initial congestion window at all, and the ones that do get slower, with a worse experience for anyone on a constrained or lossy link. A "just use the NIST-approved algorithm" migration would trade a cryptographic risk you can't observe (a recorded connection decrypted years from now) for a reliability regression you'd see in your error logs the same week you shipped it.
Worth being precise about what MTCs do and don't fix, because it's easy to conflate two separate post-quantum problems. Key exchange — the part of the handshake that decides what a passive eavesdropper can decrypt later if they recorded the traffic today — is already being hardened independently, through hybrid schemes like X25519MLKEM768 that many servers and browsers support today. That's an orthogonal, largely-solved problem. MTCs are aimed squarely at authentication — proving the server you're talking to actually controls the domain — which is the half of the handshake that a naive ML-DSA swap breaks on size. A platform can (and should) turn on hybrid post-quantum key exchange right now without waiting on any of the MTC timeline below; it's the authentication side that needs the new certificate architecture.
What an MTC actually is — and why a certificate stops being self-contained
Merkle Tree Certificates solve the size problem by refusing to sign each certificate individually. Instead, a CA batches a large set of certificates — Let's Encrypt's own design targets trees of around 4.4 million entries — into a single Merkle tree and signs the tree's root once. Any individual certificate's "proof of inclusion" in that tree is a logarithmic-sized path, not a fresh signature: for a tree that size, the inclusion proof runs about 736 bytes. A handshake using an MTC needs one signature, one public key, and one inclusion proof — smaller than today's classical handshake, and dramatically smaller than a naive post-quantum one.
The trade-off is structural, not cosmetic. In the classical model, a certificate is self-contained: if you have the cert and the chain, you can verify it offline, forever, until it expires. An MTC is an assertion about an entry in a transparency log, and Let's Encrypt's own spec is explicit that "certificates are only usable with relying parties that have contacted a transparency service sufficiently recently." Verifying an MTC isn't just checking a signature anymore — it depends on whoever is terminating TLS having fetched reasonably fresh state from a log service. A cert stapled to your load balancer's disk six months ago and never touched again is exactly the failure mode short-lived certs were designed to prevent — and MTCs reintroduce a version of that same freshness requirement, just at the transparency-log layer instead of the certificate-lifetime layer.
What changes in ACME, concretely, and on what timeline
Let's Encrypt has been careful to say what doesn't change yet: "your current Let's Encrypt certificates will continue to be issued and renewed exactly as they always have been." Nothing in this post is an action item for today. But the roadmap is concrete enough to plan against, and the work underneath it touches more of the stack than a certificate format usually does — issuance infrastructure, the ACME protocol itself (the MTC spec, draft-davidben-tls-merkle-tree-certs, dedicates its Section 9 to ACME extensions for requesting and receiving MTC-based assertions instead of X.509 chains), revocation tooling, and the transparency-log infrastructure that MTCs subsume outright.
| Date | What happens | What your ACME automation needs to track |
|---|---|---|
| Today | Certificates issue over ACME exactly as before | Nothing — no action required |
| Late 2026 | Staging environment begins issuing MTCs | Confirm whether your ACME client (cert-manager, acme.sh, a custom issuer) has any MTC-extension support on its roadmap; test against staging once it's live, not after production ships |
| 2027 | Production-ready MTC environment | Your TLS-termination layer — the load balancer or ingress actually serving connections — needs to be able to fetch and serve inclusion proofs, not just present a cert chain, to any relying party that requests one |
The part easy to under-scope: this isn't only an ACME-client change. A self-hosted PaaS that terminates TLS for its own tenants' custom domains owns both ends of this — the client requesting the MTC from Let's Encrypt and the server-side component serving that assertion to whatever's connecting to a tenant's app. If your ingress currently just hands a cert chain to OpenSSL and calls it done, that code path is what needs to change when production MTCs land, not just the renewal cron job.
There's a plausible upside buried in the same infrastructure shift: Let's Encrypt already folds Certificate Transparency logging into the MTC design rather than treating it as a bolt-on, which means the transparency-log freshness check a relying party performs can double as a revocation signal — a certificate whose issuer stops vouching for it simply stops appearing fresh in the log, without a separate OCSP or CRL round trip. That's the same direction 6-day certs pushed things (shrink the window a compromised cert stays trusted instead of leaning on revocation infrastructure that's historically been unreliable at internet scale) arrived at by a different mechanism. Don't bank on it operationally before Let's Encrypt documents the production revocation model in 2027, but it's a reason the two migrations rhyme even though the code doesn't overlap.
This stacks on the 6-day migration — it doesn't replace it
If you're running a git-push PaaS that already reworked its ACME automation for Let's Encrypt's 6-day shortlived profile, the temptation is to file MTCs under "another Let's Encrypt certificate change, same playbook." It isn't, but it also isn't unrelated — both migrations are pulling your TLS layer in the identical direction: away from "issue a cert and forget about it until it expires" and toward "verification depends on something being freshly checked, continuously, for as long as the connection needs to be trusted."
For 6-day certs, that freshness requirement lived in renewal cadence — a domain re-proves control roughly every three days instead of every month, which is why batch-scheduled nightly renewal jobs stop working and continuous, staggered renewal against ACME Renewal Information becomes load-bearing. For MTCs, the freshness requirement moves one layer over: it's not about how often you renew, it's about how recently whatever's verifying your certificate has synced with a transparency log. The discipline is the same — no more "set it and forget it" — but the mechanism and the code path are different enough that the renewal-scheduling work you already did for 6-day certs doesn't carry over to the transparency-log-freshness work MTCs will require. Budget for it as a second, distinct engineering effort, not a follow-on patch to the first.
That's also the concrete reason "post-quantum" is the wrong mental model to plan around here. It isn't one migration with a start and an end date; it's an architectural shift in what a certificate is — from a self-contained bearer credential to a claim that needs a live, periodically-refreshed round trip to a transparency service — and the quantum-resistant algorithm is just the forcing function that made the shift happen now instead of later.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own, with an ACME automation layer built to keep up with exactly this kind of certificate-lifecycle shift. Star the repo on GitHub or deploy your first app today.



