PQC Migration Roadmap: How to Build One and Where to Start
Jul 02, 2026
ArticleBuild a funded post-quantum migration roadmap: inventory crypto, rank business impact and sequence algorithm change without freezing delivery.
Read article
ML-DSA certificates explained: FIPS 204 sizes, SLH-DSA, hybrid certificates, RFC 9881 and a migration path for a post-quantum certificate authority.
ML-DSA certificates are X.509 certificates whose public key and signature use ML-DSA, the Module-Lattice-Based Digital Signature Algorithm that NIST standardized in FIPS 204 in August 2024. They replace RSA and ECDSA signatures, which a large enough quantum computer could forge, with a signature scheme designed to resist quantum attacks. The IETF has defined how to encode ML-DSA in X.509 certificates in RFC 9881 (October 2025).
The decision for a security team is no longer whether to move a PKI to post-quantum signatures, but where to start and in what order. Public TLS isn't ready: as of October 2026 the CA/Browser Forum has not adopted a ballot that allows ML-DSA in publicly trusted TLS certificates. Private PKI is a different story. When you run the CA and control both the issuer and the relying parties, you can start building and testing a post-quantum certificate authority now.
This guide covers what ML-DSA and SLH-DSA are, the real size impact on certificate chains, where the IETF standards stand, when to choose hybrid (composite) certificates over pure post-quantum ones, and a step-by-step migration path for a private CA hierarchy.
Encryption and signatures face different quantum risks. Encrypted traffic can be recorded today and decrypted later (store now, decrypt later), which is why key exchange moved first. Signatures are checked at the moment of use, so a forged signature only matters once someone can actually forge one. That sounds like more time, but PKI has the longest lead times in cryptography:
A PKI migration therefore starts with the top of the hierarchy and with distributing trust, long before the last leaf certificate changes. Regulators expect a plan; for Swiss banks, see the FINMA 05/2026 post-quantum migration.
NIST published both standards on 13 August 2024:
FIPS 204 defines three parameter sets. Sizes are in bytes, from FIPS 204 Table 2; security categories from Section 4.
| Parameter set | NIST security category | Public key | Private key | Signature |
|---|---|---|---|---|
| ML-DSA-44 | 2 | 1,312 | 2,560 | 2,420 |
| ML-DSA-65 | 3 | 1,952 | 4,032 | 3,309 |
| ML-DSA-87 | 5 | 2,592 | 4,896 | 4,627 |
FIPS 204 does not express strength as "128 bits of security". Each category means breaking the parameter set needs at least the resources required to break a reference block cipher or hash function. In practice, ML-DSA-65 is a common default for CA and server certificates, ML-DSA-87 for roots and high-assurance use, and ML-DSA-44 where size matters most.
SLH-DSA relies only on the security of hash functions, a conservative assumption that is independent of the lattice mathematics behind ML-DSA. FIPS 205 approves 12 parameter sets, each instantiated with SHA-2 or SHAKE. The suffix tells you the trade-off: "s" sets are designed for relatively small signatures, "f" sets for relatively fast signature generation.
| Parameter set (SHA2 or SHAKE) | Security category | Public key | Signature |
|---|---|---|---|
| SLH-DSA-128s | 1 | 32 | 7,856 |
| SLH-DSA-128f | 1 | 32 | 17,088 |
| SLH-DSA-192s | 3 | 48 | 16,224 |
| SLH-DSA-192f | 3 | 48 | 35,664 |
| SLH-DSA-256s | 5 | 64 | 29,792 |
| SLH-DSA-256f | 5 | 64 | 49,856 |
Public keys are tiny, signatures are large, and signing is slow compared with ML-DSA. That makes SLH-DSA a fit for roots and other keys that sign rarely and must last a long time, and a poor fit for TLS leaf certificates that sign on every handshake.
| ML-DSA (FIPS 204) | SLH-DSA (FIPS 205) | |
|---|---|---|
| Security basis | Module lattices | Hash functions only |
| Public key | 1.3 to 2.6 KB | 32 to 64 bytes |
| Signature | 2.4 to 4.6 KB | 7.9 to 49.9 KB |
| Signing speed | Fast | Slow ("s") to moderate ("f") |
| Typical PKI role | Intermediates, leaves, also roots | Long-lived roots, firmware, diversity hedge |
| X.509 encoding | RFC 9881 | RFC 9909 |
An X.509 certificate carries the subject's public key and the issuer's signature. With ECDSA P-256 both are measured in tens of bytes. With ML-DSA they are measured in kilobytes.
Using the FIPS 204 sizes, an ML-DSA-65 certificate signed by an ML-DSA-65 issuer carries 1,952 + 3,309 = 5,261 bytes of key and signature material before any names or extensions. In a TLS 1.3 handshake the server typically sends its leaf and intermediate certificates plus a CertificateVerify signature, so an all-ML-DSA-65 chain adds roughly:
| Handshake element | ML-DSA-65 bytes |
|---|---|
| Leaf: public key + intermediate's signature | 5,261 |
| Intermediate: public key + root's signature | 5,261 |
| CertificateVerify signature | 3,309 |
| Total crypto material | 13,831 |
What this means in practice:
Use the ACME automation guide for private CAs and the 47-day TLS certificate lifetime timeline to plan the renewal side: shorter lifetimes and larger certificates both push towards fully automated issuance.
| Item | Document | Status (15 October 2026) |
|---|---|---|
| ML-DSA algorithm | NIST FIPS 204 | Final, 13 August 2024 |
| SLH-DSA algorithm | NIST FIPS 205 | Final, 13 August 2024 |
| ML-DSA in X.509 | RFC 9881, "Internet X.509 PKI: Algorithm Identifiers for ML-DSA" | Proposed Standard, October 2025 |
| SLH-DSA in X.509 | RFC 9909, "Internet X.509 PKI: Algorithm Identifiers for SLH-DSA" | Proposed Standard, December 2025 |
| Composite ML-DSA | draft-ietf-lamps-pq-composite-sigs-19 | Internet-Draft, submitted to the IESG, in the RFC Editor queue; not yet an RFC |
| PQC in S/MIME | CA/B Forum Ballot SMC013 | Adopted 22 August 2025 (ML-DSA and ML-KEM, non-hybrid) |
| PQC in public TLS | CA/B Forum "Allow ML-DSA" ballot | Still being drafted in the Server Certificate Working Group; not adopted |
The composite draft defines 18 combinations of ML-DSA with a traditional algorithm, for example id-MLDSA65-ECDSA-P256-SHA512 and id-MLDSA87-ECDSA-P384-SHA512. A composite signature is valid only if every component signature verifies, so an attacker would have to break both algorithms. Until the RFC is published, OIDs and encodings can still change; keep composite certificates in test or private use and track the final RFC.
Public TLS. The CA/Browser Forum's Server Certificate Working Group has been working on an "Allow ML-DSA" ballot since at least spring 2026. The May 2026 minutes record open questions on Certificate Transparency log capacity and whether traditional X.509 certificates will be part of the post-quantum transition at all; Merkle Tree Certificates were also mentioned. The August 2026 minutes say work continues towards a combined ballot. No ML-DSA ballot appears on the Forum's ballot list. The same May minutes record that ML-DSA trust anchor support for private PKI in TLS 1.3 will ship in Chrome 150.
A private (internal) CA is where post-quantum certificates are usable today, for three reasons:
Typical first candidates: service-to-service mTLS inside Kubernetes, internal APIs, VPN and device identity where you ship the client, and code or firmware signing with your own verifier. Keep public-facing websites on classical certificates from public CAs until the WebPKI rules change. If your internal PKI runs on Active Directory Certificate Services, review its known limitations (see Related Resources) before planning a PQC hierarchy on it.
Hybrid certificates combine a post-quantum and a classical algorithm so the result stays secure as long as either one holds. The approach standardized in IETF LAMPS is the composite certificate: one certificate with one composite public key and one composite signature (for example ML-DSA-65 + ECDSA P-256). The alternative is parallel chains: a classical chain and a pure PQC chain side by side, with each client using the one it understands.
| Situation | Recommended choice | Why |
|---|---|---|
| You control issuer and every relying party, all on PQC-capable libraries | Pure ML-DSA | Smallest PQC footprint, standardized in RFC 9881, no dependency on a draft |
| Long-lived root that signs rarely and must survive a lattice break | SLH-DSA (or ML-DSA-87) root | Hash-only security assumption, tiny public key |
| Mixed estate: some relying parties are classical only | Parallel classical + PQC chains | Each client validates the chain it understands; no client sees an unknown algorithm |
| Regulator or policy requires a classical algorithm alongside PQC during transition | Composite (hybrid) | Both signatures must verify, protecting against a flaw in either algorithm |
| You need to hedge against implementation bugs in new PQC code | Composite (hybrid) | A broken ML-DSA implementation alone does not break the signature |
| Public-facing TLS for browsers | Classical (for now) | No CA/B Forum ballot allows ML-DSA in public TLS certificates yet |
Two points that often get missed. A composite certificate is not readable by a classical-only client: it uses a new algorithm identifier, so an old verifier still fails. And composite certificates are slightly larger than pure ML-DSA ones, since they also carry the classical key and signature.
A practical sequence for moving an internal PKI to post-quantum signatures:
List every CA, its algorithm, key size, validity and where its key lives, plus every certificate consumer that will need a new trust anchor. A cryptographic bill of materials (CBOM) and a discovery scan give you the starting point; cryptographic posture management keeps it current.
| Tier | Example choice | Notes |
|---|---|---|
| Root CA | ML-DSA-87 or SLH-DSA-128s | Signs rarely; long validity |
| Issuing / intermediate CA | ML-DSA-65 | Signs often; certificate goes into every chain |
| Leaf (servers, services) | ML-DSA-44 or ML-DSA-65 | Balance size against required category |
| Hybrid tier for mixed clients | ML-DSA-65 + ECDSA P-256 composite | Where policy requires a classical component |
The issuing CA's algorithm must be one its parent can sign and its children's verifiers understand. Do not mix a PQC intermediate under a classical root and call the chain quantum-safe: an attacker who can forge the root's signature can forge the whole chain.
Generate the new root key in an HSM or vault, never on a workstation. Keep the existing classical root running. The two hierarchies operate side by side during the transition.
This is the longest step. Push the PQC root into OS trust stores, container base images, Java truststores, mobile device management profiles and device firmware. Distributing the anchor costs nothing at runtime until it is used, so start now even if issuance comes later.
Create ML-DSA intermediates under the new root. Move one service group at a time to leaves from the PQC chain, using automated enrollment (ACME, EST, SCEP or CMP) so renewal does not depend on people.
Serve classical and PQC chains to the clients that support each. Measure handshake size, latency and failures. When a group of relying parties is fully PQC-capable, stop issuing classical certificates to it.
Let classical leaves expire, revoke what remains, publish final CRLs, then remove the classical root from trust stores.
DuoKey's certificate management in DuoKey Cockpit is built for the migration path above. According to DuoKey's PKI documentation:
Pointing Kubernetes cert-manager at a DuoKey CA over ACME uses the CA's directory URL:
# ClusterIssuer pointing cert-manager at a DuoKey CA over ACME
server: https://{cockpit-url}/api/pki/acme/{ca-id}/directory
DuoKey's documentation gives the same recommendation as this guide: use PQC where you control both ends, and use the hybrid composite where you must interoperate with classical relying parties, because "not every browser, server or device understands ML-DSA / SLH-DSA yet."
To find which certificates and keys need to move first, start with the free Quantum Readiness Score.
Q: What is an ML-DSA certificate?
An ML-DSA certificate is an X.509 certificate that uses ML-DSA (FIPS 204) for its public key and signature instead of RSA or ECDSA. The encoding is defined in RFC 9881. It is designed to remain secure against attacks by quantum computers.
Q: Do browsers support ML-DSA certificates?
Not for the public web yet. The CA/Browser Forum has not adopted a ballot allowing ML-DSA in publicly trusted TLS certificates, so public CAs cannot issue them for websites. For private PKI, CA/B Forum minutes from May 2026 record that ML-DSA trust anchor support for private PKI in TLS 1.3 will ship in Chrome 150.
Q: What is the difference between ML-DSA and SLH-DSA?
ML-DSA (FIPS 204) is lattice-based, with keys and signatures of a few kilobytes and fast signing. SLH-DSA (FIPS 205) relies only on hash functions, with 32-64 byte public keys but signatures from about 7.9 KB to 49.9 KB and slower signing. ML-DSA suits most certificates; SLH-DSA suits long-lived roots and firmware signing.
Q: What is a composite (hybrid) certificate?
A composite certificate holds one combined public key, for example ML-DSA-65 + ECDSA P-256, and one combined signature that is valid only if both component signatures verify. It is defined in the IETF LAMPS draft draft-ietf-lamps-pq-composite-sigs, which is in the RFC Editor queue but not yet published as an RFC.
Q: Which ML-DSA parameter set should I use?
ML-DSA-65 (category 3) is a reasonable default for intermediates and servers. Use ML-DSA-87 (category 5) for roots or high-assurance requirements, and ML-DSA-44 (category 2) where certificate size is the main constraint.
Q: How much bigger are ML-DSA certificates?
An ML-DSA-65 certificate signed by an ML-DSA-65 CA carries 5,261 bytes of public key and signature, against tens of bytes for ECDSA P-256. A two-certificate chain plus the handshake signature adds about 13.8 KB to a TLS 1.3 handshake.
Q: Is ML-DSA standardized for X.509?
Yes. RFC 9881 (October 2025) defines ML-DSA algorithm identifiers for X.509, and RFC 9909 (December 2025) does the same for SLH-DSA. Both are IETF Proposed Standards.
Q: Should I use hybrid or pure post-quantum certificates?
Use pure ML-DSA where you control the issuer and every relying party. Use composite certificates where policy requires a classical component or you want a hedge against PQC implementation bugs, and parallel classical and PQC chains where some clients remain classical-only.
Q: Can I build a post-quantum certificate authority today?
Yes, for private PKI. Create a PQC root in an HSM or vault, distribute it to your trust stores, then issue ML-DSA intermediates and leaves through automated enrollment, running parallel chains until your clients are ready.
Post-quantum PKI starts at the top of the hierarchy and with trust distribution, not with the last leaf certificate. Private PKI is where you can build and measure it today, while the public WebPKI rules are still being written.
Written by
DuoKey Team
Related Resources
Tell us where control is difficult today. We will help you identify a practical next step.