By Fatskills Exam Guides Team — the exam nerds behind 28,500+ quizzes and 2.1M practice questions across 500+ global exams.
(CA, RA, CRL, OCSP – Deploy, Troubleshoot, Secure)
PKI (Public Key Infrastructure) is the backbone of secure digital communication—it’s how your browser trusts https://google.com, how VPNs authenticate users, and how code signing ensures software isn’t tampered with. If PKI breaks, everything breaks: - Websites show "Your connection is not private" (ERR_CERT_AUTHORITY_INVALID). - VPNs fail to connect ("Certificate not trusted"). - Email encryption (S/MIME) stops working. - IoT devices can’t securely phone home.
https://google.com
Real-world scenario: You’re a sysadmin at a mid-sized company. Your CEO’s laptop suddenly can’t access internal apps because the internal CA’s certificate expired. Users see scary browser warnings, and your helpdesk is flooded. You have 30 minutes to fix it before the CEO’s big presentation.
This guide gives you the immediate, practical skills to: ? Deploy a private CA (like OpenSSL or Windows AD CS). ? Issue and revoke certificates (and know when to use CRL vs. OCSP). ? Troubleshoot PKI failures (e.g., "Why does my browser hate this cert?"). ? Pass Security+ questions about PKI components (they’re on the exam every time).
.csr
.pem
.crt
.cer
.der
.pfx
.p12
.p7b
Goal: Set up a private CA, issue a certificate for internal.example.com, and revoke it (then test CRL/OCSP).
internal.example.com
openssl
sudo apt install openssl
/etc/hosts
# Create directories mkdir -p ~/pki/{root-ca,certs,crl,newcerts,private} cd ~/pki/root-ca chmod 700 private # Generate root CA private key (RSA 4096-bit) openssl genrsa -aes256 -out private/root-ca.key.pem 4096 # Enter a strong passphrase (e.g., 20+ chars with symbols) # Create root CA config file (root-ca.cnf) cat > root-ca.cnf << 'EOF' [ ca ] default_ca = CA_default [ CA_default ] dir = ~/pki/root-ca certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand private_key = $dir/private/root-ca.key.pem certificate = $dir/certs/root-ca.cert.pem crlnumber = $dir/crlnumber crl = $dir/crl/root-ca.crl.pem crl_extensions = crl_ext default_crl_days = 30 default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 3650 preserve = no policy = policy_strict [ policy_strict ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 4096 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 x509_extensions = v3_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address [ v3_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ crl_ext ] authorityKeyIdentifier=keyid:always EOF # Initialize CA database touch index.txt echo 1000 > serial echo 1000 > crlnumber # Generate root CA certificate (self-signed) openssl req -config root-ca.cnf \ -key private/root-ca.key.pem \ -new -x509 -days 3650 -sha256 -extensions v3_ca \ -out certs/root-ca.cert.pem # Fill in details (Common Name = "Example Root CA")
Verify:
openssl x509 -noout -text -in certs/root-ca.cert.pem
Issuer
Subject
CA:TRUE
keyCertSign
Key Usage
# Create directories mkdir -p ~/pki/intermediate-ca/{certs,crl,newcerts,private,csr} cd ~/pki/intermediate-ca chmod 700 private # Generate intermediate CA private key openssl genrsa -aes256 -out private/intermediate-ca.key.pem 4096 # Create intermediate CA config (intermediate-ca.cnf) cat > intermediate-ca.cnf << 'EOF' [ ca ] default_ca = CA_default [ CA_default ] dir = ~/pki/intermediate-ca certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/index.txt serial = $dir/serial RANDFILE = $dir/private/.rand private_key = $dir/private/intermediate-ca.key.pem certificate = $dir/certs/intermediate-ca.cert.pem crlnumber = $dir/crlnumber crl = $dir/crl/intermediate-ca.crl.pem crl_extensions = crl_ext default_crl_days = 30 default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 1825 preserve = no policy = policy_loose [ policy_loose ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 4096 distinguished_name = req_distinguished_name string_mask = utf8only default_md = sha256 x509_extensions = v3_intermediate_ca [ req_distinguished_name ] countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address [ v3_intermediate_ca ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign EOF # Initialize intermediate CA database touch index.txt echo 1000 > serial echo 1000 > crlnumber # Generate CSR for intermediate CA openssl req -config intermediate-ca.cnf \ -new -sha256 \ -key private/intermediate-ca.key.pem \ -out csr/intermediate-ca.csr.pem # Common Name = "Example Intermediate CA" # Sign the intermediate CA with the root CA cd ~/pki/root-ca openssl ca -config root-ca.cnf \ -extensions v3_intermediate_ca \ -days 1825 -notext -md sha256 \ -in ../intermediate-ca/csr/intermediate-ca.csr.pem \ -out ../intermediate-ca/certs/intermediate-ca.cert.pem
openssl verify -CAfile certs/root-ca.cert.pem \ ../intermediate-ca/certs/intermediate-ca.cert.pem
../intermediate-ca/certs/intermediate-ca.cert.pem: OK
# Generate private key for the server openssl genrsa -out ~/pki/intermediate-ca/private/internal.example.com.key.pem 2048 # Create CSR openssl req -new -sha256 \ -key ~/pki/intermediate-ca/private/internal.example.com.key.pem \ -out ~/pki/intermediate-ca/csr/internal.example.com.csr.pem \ -subj "/CN=internal.example.com" # Sign the CSR with the intermediate CA cd ~/pki/intermediate-ca openssl ca -config intermediate-ca.cnf \ -extensions server_cert \ -days 365 -notext -md sha256 \ -in csr/internal.example.com.csr.pem \ -out certs/internal.example.com.cert.pem # Create a full chain (server cert + intermediate CA) cat certs/internal.example.com.cert.pem \ certs/intermediate-ca.cert.pem \ > certs/internal.example.com.chain.pem
openssl verify -CAfile ~/pki/root-ca/certs/root-ca.cert.pem \ -untrusted certs/intermediate-ca.cert.pem \ certs/internal.example.com.cert.pem
certs/internal.example.com.cert.pem: OK
# Revoke the certificate cd ~/pki/intermediate-ca openssl ca -config intermediate-ca.cnf \ -revoke certs/internal.example.com.cert.pem # Generate CRL openssl ca -config intermediate-ca.cnf \ -gencrl -out crl/intermediate-ca.crl.pem # Check the CRL openssl crl -in crl/intermediate-ca.crl.pem -noout -text
Revoked Certificates
Test OCSP:
# Start an OCSP responder (in a new terminal) openssl ocsp -index index.txt -port 8888 -rsigner certs/intermediate-ca.cert.pem \ -rkey private/intermediate-ca.key.pem -CA certs/intermediate-ca.cert.pem \ -text -out ocsp.log # Query OCSP (in original terminal) openssl ocsp -CAfile ~/pki/root-ca/certs/root-ca.cert.pem \ -issuer certs/intermediate-ca.cert.pem \ -cert certs/internal.example.com.cert.pem \ -url http://127.0.0.1:8888 -text
internal.example.com.cert.pem: revoked
index.txt
serial
*.example.com
crl.example.com
Certificate Authority (CA) (it issues certs, doesn’t verify identity).
"What’s the difference between CRL and OCSP?"
OCSP: A real-time query to check a single cert’s status.
"Why would
Join 4M+ learners. Unlock unlimited quizzes, wrong-answer tracking, flashcards + reminders, study guides, and 1-on-1 challenges.