Skip to content

OCSP Responder

This guide covers the Online Certificate Status Protocol (OCSP) responder implementation.

Online Certificate Status Protocol (OCSP) provides real-time certificate revocation checking. The QPKI implementation is compliant with RFC 6960 (X.509 Internet PKI OCSP) and RFC 5019 (Lightweight OCSP Profile). It supports classical algorithms (ECDSA, RSA, Ed25519), post-quantum (ML-DSA), and hybrid (Catalyst).

CriterionCRLOCSP
LatencyFull downloadPer-certificate query
BandwidthHigh (complete list)Low (single response)
Real-timeNo (update interval)Yes
PrivacyNo leakageResponder sees queries
TLS StaplingNoYes
┌─────────────────────────────────────────────────────────────────────┐
│ OCSP Responder │
├─────────────────────────────────────────────────────────────────────┤
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────┐ │
│ │ HTTP Handler │────│ Responder │────│ CA Store │ │
│ │ (GET + POST) │ │ (RFC 6960) │ │ (index) │ │
│ └──────────────────┘ └──────────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘

Operation Modes:

  1. Delegated Responder (recommended)

    • Responder certificate with EKU ocspSigning (OID 1.3.6.1.5.5.7.3.9)
    • OCSP No Check extension to prevent recursion
    • Separate key from CA
  2. CA-Signed

    • CA signs responses directly
    • Simpler but less flexible

Create a signed OCSP response.

Terminal window
# Sign with credential (recommended)
qpki ocsp sign --serial 0A1B2C3D --status good \
--ca ca.crt --credential ocsp-responder --out response.ocsp
qpki ocsp sign --serial 0A1B2C3D --status good \
--ca ca.crt --cert responder.crt --key responder.key --out response.ocsp
qpki ocsp sign --serial 0A1B2C3D --status revoked \
--revocation-time "2024-01-15T10:00:00Z" \
--revocation-reason keyCompromise \
--ca ca.crt --cert responder.crt --key responder.key --out response.ocsp
qpki ocsp sign --serial 0A1B2C3D --status unknown \
--ca ca.crt --cert responder.crt --key responder.key --out response.ocsp

Options:

FlagDescriptionDefault
--serialSerial number (hex)Required
--statusgood, revoked, unknownRequired
--caCA certificateRequired
--certResponder certificate-
--keyResponder private key-
--credentialCredential ID (alternative to —cert/—key)-
--cred-dirCredentials directory./credentials
--hsm-configHSM configuration file-
--key-labelHSM key label (CKA_LABEL)-
--key-idHSM key ID (CKA_ID, hex)-
--validityResponse validity period1h
--revocation-timeRevocation date (RFC 3339)-
--revocation-reasonCRL reason-
-o, --outOutput filestdout

Verify an OCSP response.

Terminal window
# Basic verification
qpki ocsp verify --response response.ocsp --ca ca.crt
qpki ocsp verify --response response.ocsp --ca ca.crt --cert server.crt
qpki ocsp verify --response response.ocsp --ca ca.crt --nonce 0102030405060708

Create an OCSP request.

Terminal window
# Simple request
qpki ocsp request --ca ca.crt --cert server.crt --out request.ocsp
qpki ocsp request --ca ca.crt --cert server.crt --nonce --out request.ocsp
qpki ocsp request --ca ca.crt --serial 0A1B2C3D --out request.ocsp

Display OCSP response information.

Terminal window
qpki ocsp info response.ocsp

Start an HTTP OCSP responder server.

Terminal window
# Serve with credential (recommended)
qpki ocsp serve --port 8080 --ca-dir /path/to/ca --credential ocsp-responder
qpki ocsp serve --port 8080 --ca-dir /path/to/ca \
--cert responder.crt --key responder.key
qpki ocsp serve --port 8080 --ca-dir /path/to/ca \
--cert responder.crt --key responder.key --validity 24h
qpki ocsp serve --port 8080 --ca-dir /path/to/ca \
--cert responder.crt --key responder.key --pid-file /var/run/ocsp.pid

Options:

FlagDescriptionDefault
--portHTTP port8080
--addrFull listen address:8080
--ca-dirCA directory (with index.txt)Required
--certResponder certificate-
--keyResponder private key-
--credentialCredential ID (alternative to —cert/—key)-
--cred-dirCredentials directory./credentials
--hsm-configHSM configuration file-
--key-labelHSM key label (CKA_LABEL)-
--key-idHSM key ID (CKA_ID, hex)-
--validityResponse validity1h
--pid-filePID file path/tmp/qpki-ocsp-{port}.pid

Stop a running OCSP responder server.

Terminal window
# Stop using default PID file (based on port)
qpki ocsp stop --port 8080
qpki ocsp stop --pid-file /var/run/ocsp.pid

Options:

FlagDescriptionDefault
--portPort to derive default PID file8080
--pid-filePID file path/tmp/qpki-ocsp-{port}.pid

Note: The stop command sends a SIGTERM signal to the process. This works on Unix-like systems (Linux, macOS) but not on Windows.


Terminal window
# ECDSA
qpki credential enroll --ca-dir ./ca --cred-dir ./credentials \
--profile ec/ocsp-responder --var cn=ocsp.example.com --id ocsp-responder
qpki credential enroll --ca-dir ./ca --cred-dir ./credentials \
--profile ml/ocsp-responder --var cn=pqc-ocsp.example.com --id pqc-ocsp-responder
qpki credential enroll --ca-dir ./ca --cred-dir ./credentials \
--profile hybrid/catalyst/ocsp-responder --var cn=hybrid-ocsp.example.com --id hybrid-ocsp-responder
qpki ocsp serve --port 8080 --ca-dir ./ca \
--cert ./credentials/ocsp-responder/ocsp-responder.crt \
--key ./credentials/ocsp-responder/ocsp-responder.key
Terminal window
# 1. Generate key
qpki key gen --algo ecdsa-p256 --out ocsp-responder.key
qpki csr create --key ocsp-responder.key --cn ocsp.example.com --out ocsp-responder.csr
qpki cert issue --ca-dir ./ca --profile ec/ocsp-responder --csr ocsp-responder.csr --out ocsp-responder.crt
qpki ocsp serve --port 8080 --ca-dir ./ca \
--cert ocsp-responder.crt --key ocsp-responder.key

Using credentials for ocsp serve enables zero-downtime certificate rotation via the rotate → activate workflow:

Terminal window
# 1. Start server with credential
qpki ocsp serve --port 8080 --ca-dir ./ca --credential ocsp-responder
qpki credential rotate ocsp-responder
qpki credential versions ocsp-responder
qpki credential activate ocsp-responder --version v2

The server always uses the active version of the credential. This workflow allows:

  • Certificate renewal without service interruption
  • Gradual rollout with rollback capability
  • Crypto-agility migration (add/remove algorithm profiles)

Terminal window
# Create request with OpenSSL
openssl ocsp -issuer ca.crt -cert server.crt -reqout request.ocsp -no_nonce
openssl ocsp -issuer ca.crt -cert server.crt \
-url http://localhost:8080 -resp_text
openssl ocsp -respin response.ocsp -CAfile ca.crt -resp_text

Note: OpenSSL does not support ML-DSA. Use qpki ocsp verify for PQC responses.


The id-pkix-ocsp-nocheck extension (OID 1.3.6.1.5.5.7.48.1.5) indicates the responder certificate should not be checked via OCSP, avoiding infinite loops. This extension is automatically added to ocsp-responder profiles.


OCSP signing operations support HSM-stored keys.

Terminal window
export HSM_PIN="****"
# Sign OCSP response with HSM key
qpki ocsp sign --serial 0A1B2C3D --status good \
--ca ca.crt --cert responder.crt \
--hsm-config ./hsm.yaml --key-label "ocsp-key" --out response.ocsp
# Start OCSP server with HSM key
qpki ocsp serve --port 8080 --ca-dir ./ca --cert responder.crt \
--hsm-config ./hsm.yaml --key-label "ocsp-key"

See HSM Integration for configuration details.


  • CRL - Certificate revocation with CRL
  • Credentials - OCSP responder credentials
  • HSM - Hardware Security Module integration
  • RFC 6960 - OCSP specification
  • RFC 5019 - Lightweight OCSP Profile