Introduction
Online Certificate Status Protocol (OCSP) provides real-time certificate revocation checking as an alternative to Certificate Revocation Lists (CRLs). When a TLS client connects to a server, it may query the certificate authority's OCSP responder to verify the certificate hasn't been revoked. This check adds latency but provides more current revocation status than periodically published CRLs.
OCSP stapling improves this flow by having the server pre-fetch and cache the OCSP response, then "staple" it to the TLS handshake. The client receives the signed OCSP response directly from the server without making a separate request to the CA. This reduces latency and preserves privacy by not revealing client connections to the CA.
When OCSP checking fails—because the responder is unreachable, stapling is disabled or broken, or the certificate chain is incomplete—clients react differently. Some soft-fail, accepting the certificate with a warning. Others hard-fail, rejecting connections when revocation status cannot be confirmed. Understanding OCSP mechanics and troubleshooting stapling configuration is essential for reliable TLS deployments.
Symptoms
When SSL OCSP revocation checks fail, you will observe these symptoms:
- SSL/TLS scanners report revocation status could not be verified
- Some clients connect successfully while others fail or warn
- Browser security indicators show mixed states (some warn, some don't)
- OpenSSL s_client shows OCSP response is not stapled
- Server logs show OCSP responder connection timeouts
- Certificate appears valid but clients refuse to connect
- Corporate or security-sensitive clients reject connections entirely
Common OpenSSL output showing missing OCSP stapling:
```bash openssl s_client -connect example.com:443 -servername example.com -status
# Output when stapling not working: OCSP response: no response sent
# Output when stapling works: OCSP response: ====================================== OCSP Response Status: successful (0) Response Type: Basic OCSP Response ... ```
Browser behavior variations:
Chrome: May show "Connection is secure" but security scan warns about OCSP
Firefox: May connect but certificate viewer shows "Could not verify revocation status"
Safari: Often soft-fails, connects despite OCSP issues
Corporate clients: May hard-fail, blocking the connectionSSL Labs scan output:
OCSP stapling: No
Revocation status: Unable to check (OCSP responder unreachable)Common Causes
Several factors cause OCSP revocation check failures:
- 1.OCSP responder unreachable: The CA's OCSP responder is down, blocked by firewall, or unreachable due to network issues. Servers cannot fetch stapling responses; clients cannot perform real-time checks.
- 2.OCSP stapling not enabled: The server software (Nginx, Apache, HAProxy) doesn't have OCSP stapling configured, forcing clients to contact responders directly.
- 3.Incomplete certificate chain: The server presents a certificate without intermediate certificates, preventing OCSP response verification. The server itself cannot verify its own OCSP response.
- 4.DNS resolution failures: The server or client cannot resolve the OCSP responder hostname (e.g.,
r3.o.lencr.orgfor Let's Encrypt). - 5.Firewall blocking outbound OCSP requests: Corporate firewalls may block outbound HTTP connections to OCSP responders, preventing both stapling and client-side checks.
- 6.OCSP response expired or not yet valid: The cached OCSP response is outside its validity window, causing verification failure.
- 7.Wrong resolver configuration: Server uses a local DNS resolver that cannot reach public DNS for OCSP responder resolution.
- 8.Certificate Authority OCSP infrastructure issues: The CA's OCSP infrastructure experiences outages, affecting all certificates they issue.
Step-by-Step Fix
Follow these steps to diagnose and resolve OCSP revocation check failures:
Step 1: Check current OCSP stapling status
Verify if the server is stapling OCSP responses:
```bash # Check OCSP stapling status openssl s_client -connect example.com:443 -servername example.com -status < /dev/null 2>&1 | grep -A5 "OCSP response"
# Output for working stapling: OCSP response: ====================================== OCSP Response Status: successful (0) Cert Status: good
# Output for broken/missing stapling: OCSP response: no response sent
# Use SSL Labs for comprehensive check # Visit: https://www.ssllabs.com/ssltest/analyze.html?d=example.com ```
Step 2: Verify OCSP responder reachability
Test connectivity to the CA's OCSP responder:
```bash # Extract OCSP responder URL from certificate openssl x509 -in /etc/nginx/ssl/cert.pem -noout -ocsp_uri
# Output example: http://r3.o.lencr.org
# Test reachability curl -I http://r3.o.lencr.org
# Expected response: HTTP/1.1 200 OK Content-Type: application/ocsp-response
# Test from the server itself curl -I http://r3.o.lencr.org
# Check DNS resolution dig r3.o.lencr.org nslookup r3.o.lencr.org
# If resolution fails, check resolver configuration cat /etc/resolv.conf ```
Step 3: Verify certificate chain completeness
Check that server has complete certificate chain:
```bash # Check certificate chain on server openssl s_client -connect example.com:443 -servername example.com -showcerts < /dev/null 2>&1 | grep -E "depth|subject|issuer"
# Output should show multiple certificates: depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 depth=1 C = US, O = Let's Encrypt, CN = R3 depth=0 CN = example.com
# Check local certificate chain file openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt /etc/nginx/ssl/fullchain.pem
# Expected output: /etc/nginx/ssl/fullchain.pem: OK ```
Step 4: Enable OCSP stapling in Nginx
Configure Nginx for OCSP stapling:
```nginx server { listen 443 ssl; server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Enable OCSP stapling ssl_stapling on; ssl_stapling_verify on;
# Trusted certificate for stapling verification ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
# Resolver for OCSP responder lookup resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; } ```
Apply configuration:
```bash # Test configuration nginx -t
# Reload Nginx systemctl reload nginx
# Wait for OCSP response to be fetched (may take a few seconds) sleep 10
# Verify stapling now works openssl s_client -connect example.com:443 -servername example.com -status < /dev/null 2>&1 | grep -A2 "OCSP response" ```
Step 5: Enable OCSP stapling in Apache
Configure Apache for OCSP stapling:
```apache <VirtualHost *:443> ServerName example.com
SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
# Enable OCSP stapling SSLUseStapling on SSLStaplingResponderTimeout 5 SSLStaplingReturnResponderErrors off </VirtualHost>
# Global OCSP cache (outside VirtualHost) SSLStaplingCache shmcb:/var/run/ocsp(128000) ```
Apply configuration:
```bash # Test configuration apachectl configtest
# Reload Apache systemctl reload apache2 ```
Step 6: Check firewall rules
Verify outbound HTTP access to OCSP responders:
```bash # Test from server curl -v http://r3.o.lencr.org
# If connection fails, check firewall rules iptables -L -n | grep -i drop ufw status
# Allow outbound HTTPS/HTTP if blocked ufw allow out 80/tcp ufw allow out 443/tcp
# For iptables iptables -I OUTPUT -p tcp --dport 80 -j ACCEPT iptables -I OUTPUT -p tcp --dport 443 -j ACCEPT
# Test again curl -I http://r3.o.lencr.org ```
Step 7: Fix DNS resolution issues
Configure proper DNS resolution:
```bash # Check current resolver cat /etc/resolv.conf
# If using local resolver that's broken, add public DNS echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
# For systemd-resolved sudo systemctl restart systemd-resolved
# Test DNS resolution dig r3.o.lencr.org @8.8.8.8 ```
Step 8: Verify OCSP response manually
Test OCSP response directly:
```bash # Get OCSP responder URL OCSP_URL=$(openssl x509 -in /etc/nginx/ssl/cert.pem -noout -ocsp_uri | head -1) echo "OCSP URL: $OCSP_URL"
# Get certificate serial openssl x509 -in /etc/nginx/ssl/cert.pem -noout -serial
# Query OCSP responder directly openssl ocsp \ -issuer /etc/letsencrypt/live/example.com/chain.pem \ -cert /etc/letsencrypt/live/example.com/cert.pem \ -url "$OCSP_URL" \ -resp_text
# Expected output: Cert Status: good Next Update: Jan 22 12:00:00 2026 GMT ```
Verification
After enabling OCSP stapling, verify it works correctly:
```bash # Test OCSP stapling openssl s_client -connect example.com:443 -servername example.com -status < /dev/null 2>&1 | grep -A5 "OCSP response"
# Expected output: OCSP response: ====================================== OCSP Response Status: successful (0) Response Type: Basic OCSP Response Version: 1
# Check with SSL Labs # Visit: https://www.ssllabs.com/ssltest/
# Expected result: # OCSP stapling: Yes
# Test from multiple clients curl -I https://example.com # Should return 200 OK without certificate errors
# Monitor Nginx error log for OCSP issues tail -f /var/log/nginx/error.log | grep -i ocsp ```
Prevention
To prevent OCSP revocation check failures:
- 1.Always enable OCSP stapling: Configure stapling on all TLS servers to reduce client dependency on OCSP responder reachability.
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/chain.pem;
resolver 8.8.8.8;- 1.Use complete certificate chains: Ensure server presents full chain including intermediate certificates.
# Use fullchain.pem, not just cert.pem
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;- 1.Configure reliable DNS resolvers: Use multiple, reliable DNS servers for OCSP responder resolution.
resolver 8.8.8.8 8.8.4.4 1.1.1.1 valid=300s;- 1.Monitor OCSP stapling status: Include stapling checks in monitoring.
#!/bin/bash
# OCSP stapling monitor
STAPLING=$(openssl s_client -connect localhost:443 -status < /dev/null 2>&1 | grep "OCSP response" | head -1)
if [[ "$STAPLING" == *"no response sent"* ]]; then
echo "OCSP stapling not working" | mail -s "SSL Alert" admin@example.com
fi- 1.Allow outbound HTTP access: Ensure servers can reach CA OCSP responders.
- 2.Test after certificate renewal: OCSP responder URLs may change with new certificates.
# After renewal, verify stapling
certbot renew --deploy-hook "systemctl reload nginx && sleep 10 && openssl s_client -connect localhost:443 -status < /dev/null 2>&1 | grep 'OCSP response'"- 1.Document OCSP configuration: Keep documentation of stapling configuration for each TLS endpoint.
## TLS Configuration
- Certificate: Let's Encrypt R3
- OCSP Responder: http://r3.o.lencr.org
- Stapling: Enabled
- Resolver: 8.8.8.8
- Chain: fullchain.pemRelated Articles
- [SSL certificate troubleshooting: Fix Certificate And Private Key Do Not Match Issue](certificate-and-private-key-do-not-match)
- [Fix Fix Acme Account Still Using Old DNS Provider Credentials After Migration Issue in SSL](fix-acme-account-still-using-old-dns-provider-credentials-after-migration)
- [Fix Fix Acme Challenge Returning 404 Issue in SSL](fix-acme-challenge-returning-404)
- [Fix Fix Acme Http 01 Challenge Failing Due To Redirect Issue in SSL](fix-acme-http-01-challenge-failing-due-to-redirect)
- [Fix Fix Apache Too Many Redirects After SSL Issue in SSL](fix-apache-too-many-redirects-after-ssl)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "SSL OCSP Revocation Check Failed Because the Responder Could Not Be Reached", "description": "Resolve SSL OCSP revocation check failures by verifying responder reachability, enabling stapling, and checking issuer chain configuration on the TLS server.", "url": "https://www.fixwikihub.com/ssl-ocsp-revocation-check-failed-soft-fail-stapling", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-01-22T22:38:12.337Z", "dateModified": "2026-01-22T22:38:12.337Z" } </script>