Skip to content

Lab-05: PQC OCSP

Real-Time Certificate Verification with OCSP

Section titled “Real-Time Certificate Verification with OCSP”

Key Message: Real-time certificate verification with OCSP works exactly the same with PQC. Same HTTP protocol, same tools.

Important distinction: OCSP does not revoke certificates. It only reports revocation status. Revocation is a CA operation (see Revocation). OCSP is a distribution mechanism — like asking “is this certificate still valid?” rather than “revoke this certificate.”


You have a CRL. But it’s updated every hour. A certificate was revoked 30 seconds ago. Clients don’t know yet.

TIMELINE: The CRL Staleness Problem
───────────────────────────────────
03:00 03:30 04:00 04:30 05:00
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
CRL Cert CRL CRL CRL
published REVOKED published published published
For 30 min, clients
still trust the
revoked certificate!

“I need real-time certificate status. CRLs are too slow. Does OCSP work with PQC?”

Yes. Same HTTP protocol, same request/response format. Only signature sizes change.


  1. Create a PQC CA 1b. Issue OCSP responder certificate
  2. Start OCSP responder 2b. Issue TLS certificate
  3. Query certificate status (GOOD)
  4. Revoke the certificate 3b. Query again (REVOKED) 2c. Stop OCSP responder

Terminal window
./journey/05-ocsp/demo.sh

Terminal window
# Create PQC CA with ML-DSA-65
qpki ca init --profile profiles/pqc-ca.yaml \
--var cn="PQC CA" \
--ca-dir output/pqc-ca
qpki ca export --ca-dir output/pqc-ca --out output/pqc-ca/ca.crt
Terminal window
# Generate OCSP responder key and CSR
qpki csr gen --algorithm ml-dsa-65 \
--keyout output/ocsp-responder.key \
--cn "OCSP Responder" \
--out output/ocsp-responder.csr
# Best practice: CA key stays offline
qpki cert issue --ca-dir output/pqc-ca \
--profile profiles/pqc-ocsp-responder.yaml \
--csr output/ocsp-responder.csr \
--out output/ocsp-responder.crt
Terminal window
# Start with delegated certificate (recommended)
qpki ocsp serve --port 8888 --ca-dir output/pqc-ca \
--cert output/ocsp-responder.crt \
--key output/ocsp-responder.key
Terminal window
# Generate TLS server key and CSR
qpki csr gen --algorithm ml-dsa-65 \
--keyout output/server.key \
--cn server.example.com \
--out output/server.csr
qpki cert issue --ca-dir output/pqc-ca \
--profile profiles/pqc-tls-server.yaml \
--csr output/server.csr \
--out output/server.crt
Terminal window
# Generate OCSP request
qpki ocsp request --issuer output/pqc-ca/ca.crt \
--cert output/server.crt \
--out output/request.ocsp
# Send OCSP request (RFC 6960) - response is immediate, unlike CRL
curl -s -X POST \
-H "Content-Type: application/ocsp-request" \
--data-binary @output/request.ocsp \
http://localhost:8888/ \
-o output/response.ocsp
qpki ocsp info output/response.ocsp
Terminal window
# Revoke certificate
qpki cert revoke <serial> --ca-dir output/pqc-ca --reason keyCompromise
Terminal window
# Query again - status changes immediately! (CRL would take hours)
curl -s -X POST \
-H "Content-Type: application/ocsp-request" \
--data-binary @output/request.ocsp \
http://localhost:8888/ \
-o output/response2.ocsp
qpki ocsp info output/response2.ocsp
# Status: revoked
Terminal window
# Stop the OCSP responder
qpki ocsp stop --port 8888

CriteriaCRLOCSP
UpdatePeriodic (hourly/daily)Real-time
SizeCan be large (full list)Small (one response)
AvailabilityWorks offlineRequires network
LatencyLocal readNetwork request
Vuln. windowUntil next CRLNearly zero

In practice: Use BOTH

  • OCSP for real-time checks
  • CRL as offline fallback

┌─────────────┐ ┌──────────────────┐
│ Client │ ─── OCSP Request ──► │ OCSP Responder │
│ (curl/app) │ ◄── OCSP Response ── │ (qpki ocsp serve) │
└─────────────┘ └────────┬─────────┘
Signs with CA key
(CA key online - risk!)
┌─────────────┐ ┌──────────────────┐
│ Client │ ─── OCSP Request ──► │ OCSP Responder │
│ (curl/app) │ ◄── OCSP Response ── │ (qpki ocsp serve) │
└─────────────┘ └────────┬─────────┘
Signs with responder key
(CA key stays offline!)
┌────────▼─────────┐
│ OCSP Responder │
│ Certificate │
│ (id-kp-OCSPSign) │
└──────────────────┘

The OCSP responder certificate has:

  • Extended Key Usage: id-kp-OCSPSigning (1.3.6.1.5.5.7.3.9)
  • OCSP No Check extension (prevents infinite verification loop)

ComponentClassical (ECDSA)Post-Quantum (ML-DSA)Notes
OCSP Request~100 bytes~100 bytesSame format
OCSP Response~300 bytes~3,500 bytesPQC signature larger

Responses are larger due to ML-DSA signatures, but the protocol is unchanged.


OperationClassicalPQCNotes
Request generation<1ms<1msSame
Network round-trip~Xms~XmsSame protocol
Signature verification<1ms~2-5msML-DSA slightly slower

IndustryUse CaseWhy Real-Time Matters
Banking/FinanceTransaction signingReject compromised certs instantly
E-commercePayment processingPrevent fraud during checkout
HealthcareEHR accessImmediate access revocation
GovernmentCitizen portalsReal-time credential validation
Cloud/SaaSAPI authenticationBlock compromised service accounts

CRL alone is insufficient when:

  • Transactions are high-value (financial, legal)
  • Compliance requires real-time status (PCI-DSS, HIPAA)
  • Attack window must be minimized (< 1 hour tolerance)

  1. Same HTTP protocol: RFC 6960 works unchanged with PQC
  2. Delegated responders: Best practice keeps CA keys offline
  3. Real-time status: Revocation changes are immediate
  4. Size tradeoff: PQC responses are larger but acceptable
  5. Drop-in replacement: Existing OCSP clients work with PQC responders


Revocation | QLAB Home | Next: Code Signing →