PQ CRYPTA PLATFORM

๐Ÿ  Main

๐Ÿ“ฐ News

๐Ÿ‘ค Account

โŸจ QUANTUM ERROR PORTAL โŸฉ

Navigate the Error Dimensions

๐Ÿ” Post-Quantum X.509 Certificate Chain

ML-DSA-87 Throughout (CNSA 2.0) ยท Two Roots: ML-DSA-87 and SLH-DSA-SHA2-256s ยท FIPS 204 & 205

โœ… Chain refreshed 2026-10-06

๐ŸŽฏ What This Is

A complete, working post-quantum X.509 hierarchy you can download and verify yourself. Unlike classical PKI built on RSA or ECDSA โ€” both breakable by Shor's algorithm on a large quantum computer โ€” every signature in it is quantum-resistant:

The Chain the Server Sends ML-DSA-87 (FIPS 204) on every certificate, as NSA's CNSA 2.0 requires: the leaf and the issuing CA, both signed with ML-DSA-87
Two Roots, One Issuing CA An ML-DSA-87 root (the CNSA 2.0 path) and an SLH-DSA-SHA2-256s root (FIPS 205) that cross-certifies the same issuing CA โ€” same name, same key
Generated With OpenSSL 3.5 native FIPS 204/205 implementations โ€” no third-party providers
Chain Design Trust anchors from two algorithm families โ€” lattice and hash-based โ€” over one operational hierarchy

Why two roots: CNSA 2.0 (NSA FAQ v2.1, December 2024) approves ML-DSA-87 alone for signatures and does not approve SLH-DSA for any use, so the chain a server sends is ML-DSA-87 throughout. A hash-based root still matters: it rests only on the security of SHA-2, so a client that anchors its trust there is not exposed to an advance in lattice cryptanalysis. Cross-certification gives that client a path too โ€” the SLH-DSA root certifies the same issuing CA, and its path runs through that cross-certificate. Public CAs move between roots the same way.

๐Ÿ“ฅ Download the Hierarchy

All certificates are PEM-encoded X.509v3, using the final NIST FIPS 204/205 algorithm identifiers and key encodings:

ML-DSA-87 root SHA-256 fingerprint โ€” confirm it matches after download:

F5:15:81:D7:AD:58:22:3D:6B:8D:A9:FB:3B:19:9B:32:D4:5A:B8:1A:D2:2B:D7:40:1B:2A:FE:2E:22:A5:40:63

SLH-DSA-SHA2-256s root SHA-256 fingerprint โ€” confirm it matches after download:

A7:8A:6E:45:85:63:E0:6D:A5:06:B6:FF:37:AD:6B:91:87:36:2C:E0:00:FE:40:EF:6C:1D:5B:EF:40:D9:10:DC

๐Ÿ” Verify Both Paths (OpenSSL 3.5+)

OpenSSL 3.5 and later verify ML-DSA and SLH-DSA signatures natively. Download the certificates and verify the leaf through each root:

for f in cnsa2-root-ca.crt root-ca.crt issuing-ca.crt issuing-ca-cross-slhdsa.crt server.crt; do
    curl -sO https://pqcrypta.com/pqc/$f
done

# The CNSA 2.0 path: ML-DSA-87 root, issuing CA, leaf
openssl verify -CAfile cnsa2-root-ca.crt -untrusted issuing-ca.crt server.crt
# server.crt: OK

# The hash-based path: SLH-DSA root, cross-certificate, leaf
openssl verify -CAfile root-ca.crt -untrusted issuing-ca-cross-slhdsa.crt server.crt
# server.crt: OK

Give openssl verify the issuing-CA certificate that belongs to the root you trust: it takes the first certificate whose name matches and does not try the other, where a full path builder (as browsers use) would. Inspect the algorithms directly:

openssl x509 -in cnsa2-root-ca.crt -noout -text | grep "Signature Algorithm"
#   Signature Algorithm: ML-DSA-87
openssl x509 -in root-ca.crt -noout -text | grep "Signature Algorithm"
#   Signature Algorithm: SLH-DSA-SHA2-256s
openssl x509 -in server.crt -noout -text | grep "Signature Algorithm"
#   Signature Algorithm: ML-DSA-87

Notes:

  1. OpenSSL version: check with openssl version โ€” you need 3.5.0 or later for native FIPS 204/205 support.
  2. If you have oqs-provider installed: it can shadow the native ML-DSA implementation with incompatible draft encodings. Prefix commands with OPENSSL_CONF=/dev/null to force the built-in implementation.
  3. Older chains: from July to October 2026 the leaf came from an ML-DSA-87 intermediate signed directly by the SLH-DSA root โ€” a chain CNSA 2.0 does not accept, since one of its certificates is signed with SLH-DSA. The 2025 chain used pre-final draft key encodings and is archived at root-ca-2025.crt; current OpenSSL cannot parse its public keys โ€” which is itself a useful demonstration of why the final FIPS encodings matter.

๐ŸŒ Live Post-Quantum TLS Endpoint

This chain is not just downloadable โ€” it is served live. pqc.pqcrypta.com:443 terminates TLS 1.3 on pqcrypta-proxy (OpenSSL 3.5 over TCP, rustls over HTTP/3) with the ML-DSA-87 chain above: the server signs its CertificateVerify with ML-DSA-87 and sends only ML-DSA-87 certificates. A client configured as the CNSA 2.0 TLS 1.3 profile requires โ€” ML-KEM-1024, TLS_AES_256_GCM_SHA384, ML-DSA-87 โ€” completes a handshake that meets it exactly:

OPENSSL_CONF=/dev/null openssl s_client -connect pqc.pqcrypta.com:443 -tls1_3 \
    -groups MLKEM1024 -ciphersuites TLS_AES_256_GCM_SHA384 -sigalgs mldsa87 \
    -CAfile cnsa2-root-ca.crt -verify_hostname pqc.pqcrypta.com

# Peer signature type: mldsa87
# Negotiated TLS1.3 group: MLKEM1024
# Verify return code: 0 (ok)

To verify through the SLH-DSA root instead, give s_client the root and the cross-certificate together โ€” cat root-ca.crt issuing-ca-cross-slhdsa.crt > slh-dsa-store.pem, then -CAfile slh-dsa-store.pem. OpenSSL 3.5 offers ML-DSA signature schemes by default, so openssl s_client -connect pqc.pqcrypta.com:443 -CAfile cnsa2-root-ca.crt alone completes a post-quantum handshake too (with X25519MLKEM768). With curl linked against OpenSSL 3.5+:

curl https://pqc.pqcrypta.com/pqc/cert-info.json \
    --sigalgs mldsa87 --curves MLKEM1024 --cacert cnsa2-root-ca.crt

The endpoint deliberately refuses clients that do not offer mldsa87 in their signature_algorithms โ€” there is no classical fallback certificate on this hostname (a classical-only client receives a TLS handshake_failure alert). That is why a normal browser visit fails: browsers do not offer ML-DSA signature schemes yet. When they do, this endpoint is already waiting. (pqcrypta.com itself serves both: its Let's Encrypt certificate to browsers and an ML-DSA-87 chain from the same CA to clients that accept only ML-DSA.)

๐Ÿ–ฅ๏ธ Installing a Root in Your Trust Store

Reality check: no mainstream browser can validate ML-DSA or SLH-DSA certificate signatures during a TLS handshake yet โ€” browser post-quantum support today covers key exchange (X25519MLKEM768), not certificates. Installing a root prepares your trust store for post-quantum PKI and lets OS tooling (and the OpenSSL commands above) verify the chain; it will not turn the padlock green on its own. Install the ML-DSA-87 root (cnsa2-root-ca.crt) for the path the server sends; the SLH-DSA root also needs the cross-certificate, which the leaf names in its Authority Information Access field for clients that fetch it.

Installation by platform:

  1. Linux (Debian/Ubuntu): sudo cp cnsa2-root-ca.crt /usr/local/share/ca-certificates/pqcrypta-cnsa2-root.crt && sudo update-ca-certificates
  2. Linux (RHEL/Fedora): sudo cp cnsa2-root-ca.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust
  3. Windows: certutil -addstore -f Root cnsa2-root-ca.crt from an elevated prompt, or double-click the file โ†’ Install Certificate โ†’ Local Machine โ†’ "Trusted Root Certification Authorities"
  4. macOS: double-click the certificate โ†’ Keychain Access โ†’ System keychain โ†’ Add, then open the certificate, expand "Trust", and set to "Always Trust"
  5. Firefox: Settings โ†’ Privacy & Security โ†’ Certificates โ†’ View Certificates โ†’ Authorities โ†’ Import (Firefox keeps its own store, separate from the OS)
  6. Chrome / Edge: both use the OS trust store โ€” follow the Windows or macOS steps above

Removal: delete "PQ Crypta CNSA 2.0 Root CA 2026" (or "PQ Crypta Root CA 2026") from the same store at any time. The roots are scoped to this demonstration; treat any third-party root you install with appropriate caution.

๐Ÿ“œ Certificate Details (Live from the Published Files)

Root CA โ€” ML-DSA-87 (CNSA 2.0)PQ Crypta CNSA 2.0 Root CA 2026
Signature: id-ml-dsa-87
Issued by: PQ Crypta CNSA 2.0 Root CA 2026
Valid: 2026-10-06 โ†’ 2036-10-03
Root CA โ€” SLH-DSA-SHA2-256sPQ Crypta Root CA 2026
Signature: id-slh-dsa-sha2-256s
Issued by: PQ Crypta Root CA 2026
Valid: 2026-07-19 โ†’ 2036-07-16
Issuing CA (sent by the server)PQ Crypta CNSA 2.0 Issuing CA 2026
Signature: id-ml-dsa-87
Issued by: PQ Crypta CNSA 2.0 Root CA 2026
Valid: 2026-10-06 โ†’ 2031-10-05
Issuing CA cross-certificatePQ Crypta CNSA 2.0 Issuing CA 2026
Signature: id-slh-dsa-sha2-256s
Issued by: PQ Crypta Root CA 2026
Valid: 2026-10-06 โ†’ 2031-10-04
Server Certificatepqc.pqcrypta.com
Signature: id-ml-dsa-87
Issued by: PQ Crypta CNSA 2.0 Issuing CA 2026
Valid: 2026-10-06 โ†’ 2028-10-05
Server SANs DNS: pqc.pqcrypta.com
DNS: www.pqc.pqcrypta.com

๐Ÿš€ Live PQC Encryption Demonstration

The certificates above prove post-quantum signatures work in X.509 today. This demo proves post-quantum encryption works in production today โ€” a full generate โ†’ encrypt โ†’ decrypt round trip against the live PQ Crypta API using ML-KEM-1024 with pure post-quantum signatures:

๐Ÿ”ฌ Technical Stack

Certificate Generation OpenSSL 3.5 โ€” native ML-DSA (FIPS 204) and SLH-DSA (FIPS 205), final NIST encodings
Live TLS on This Site pqcrypta-proxy โ€” OpenSSL 3.5 over TCP, rustls over HTTP/3 (QUIC); ML-KEM-1024 for CNSA 2.0 clients, X25519MLKEM768 for browsers
Encryption API ML-KEM-1024, ML-DSA-87, SLH-DSA, HQC, FrodoKEM and Classic McEliece across 35 algorithm engines
Security Level NIST Category 5 throughout (ML-DSA-87, SLH-DSA-SHA2-256s, ML-KEM-1024)

๐Ÿ’ก Why Post-Quantum PKI Matters

TLS key exchange is going post-quantum first โ€” hybrid ML-KEM is already deployed by major browsers โ€” because recorded traffic can be decrypted retroactively ("harvest now, decrypt later"). Certificates come next: signatures can't be forged retroactively, but the WebPKI must migrate before quantum computers arrive, and rotating a global trust hierarchy takes years. The families involved:

This hierarchy demonstrates that a complete post-quantum PKI is buildable and verifiable with standard tooling today โ€” one that meets CNSA 2.0 on the wire and still offers a hash-based trust anchor, through cross-certification, to clients that want one.