Nginx 在内网自建 CA 场景下仅能作为 OCSP Stapling 客户端,需先部署独立 OCSP Responder(如 CFSSL、ocspd),再配置 Nginx 通过 resolver 解析其地址、ssl_trusted_certificate 包含 OCSP 签名证书,并验证证书含有效 OCSP URI,否则 stapling 静默失效。

内网自建 CA 场景下,Nginx 本身不能直接充当 OCSP Responder 服务(即不提供 /ocsp 接口响应查询),它只支持作为 OCSP Stapling 的客户端——即主动向外部或内网已部署的 OCSP Responder 发起请求、缓存并装订响应。要实现“内网 CA + OCSP Stapling”,必须分两步:先搭建独立的 OCSP Responder 服务,再让 Nginx 正确对接该服务。
一、先部署内网 OCSP Responder(核心前提)
OCSP Responder 是一个独立 HTTP 服务,需由 CA 系统提供或单独部署。常见方案有:
-
OpenSSL ocsp 命令临时模拟(仅测试用):
运行openssl ocsp -index index.txt -port 2560 -rsigner ocsp.crt -rkey ocsp.key -CA ca.crt -text启动简易 responder,监听本地 2560 端口;但无并发、无 HTTPS、不可用于生产。 -
CFSSL(CloudFlare SSL):
推荐方案。用cfssl ocspserve启动,支持 HTTPS、签名验证、高并发。需提前用 CFSSL 初始化 CA 并生成 OCSP 签名证书。 -
Easy-RSA + 自研或第三方 OCSP 服务:
如使用ocspd(OpenCA)、dogtag(Red Hat)或基于 Python/Go 的轻量 OCSP 服务(如pyocspresponder),确保其支持 RFC 6960,能正确响应GET /ocsp或POST /ocsp请求。
关键要求:
• Responder 必须可被 Nginx 所在服务器通过 HTTP/HTTPS 访问(如 http://ocsp.internal-ca.local);
• 响应中必须返回有效 OCSP Response(status successful,cert status good);
• 证书链需完整,且 OCSP 签名证书(ocsp.crt)必须被 Nginx 的 ssl_trusted_certificate 明确信任。
二、让 Nginx 正确对接内网 OCSP Responder
这不是修改 Nginx 为 responder,而是配置它作为 stapling client 去使用你刚部署的服务:
- 确认你的内网证书含有效
Authority Information Access扩展:
运行openssl x509 -in server.crt -text -noout | grep -A1 "OCSP",输出必须类似:OCSP - URI: http://ocsp.internal-ca.local - 确保
resolver能解析该内网域名:
若用内网 DNS(如 10.0.1.1),写resolver 10.0.1.1 valid=300s;;
若用 hosts,需确保 Nginx worker 进程能读取(部分系统需重启 Nginx 生效)。 -
ssl_trusted_certificate必须包含:
→ 签发你服务器证书的中间 CA(如有);
→ 根 CA 证书;
→ OCSP 签名证书(ocsp.crt)本身(因 OCSP 响应由它签名,Nginx 验证时需信任它);
顺序:中间 CA → 根 CA → ocsp.crt(全部 PEM 拼接)。
三、验证与排错要点
内网环境最容易失败的环节:
-
DNS 解析失败:Nginx 日志出现
no resolver defined to resolve ocsp.internal-ca.local或host not found in upstream—— 检查resolver是否配置、是否可达、域名拼写是否一致(注意大小写和尾部点号)。 -
OCSP 响应校验失败:日志无报错但 stapling 不生效 —— 手动用
openssl ocsp -issuer ca.crt -cert server.crt -url http://ocsp.internal-ca.local -CAfile full-chain-trusted.pem -text测试,确认输出含response is good且时间有效(thisUpdate/nextUpdate在当前±5分钟内)。 -
证书链缺失 OCSP 签名证书:
ssl_stapling_verify on会静默拒绝响应 —— 若手动测试返回unable to get certificate CRL或verify error:num=20:unable to get local issuer certificate,说明ssl_trusted_certificate缺少 ocsp.crt 或其 issuer。
四、进阶:避免依赖实时网络查询
内网环境更建议采用 ssl_stapling_file 预加载模式:
- 用脚本定期调用
openssl ocsp向内网 responder 获取 DER 响应:openssl ocsp -no_nonce -respout /var/lib/nginx/ocsp/server.ocsp.resp -issuer ca.crt -cert server.crt -url http://ocsp.internal-ca.local -CAfile full-chain-trusted.pem - 在 Nginx server 块中添加:
ssl_stapling_file /var/lib/nginx/ocsp/server.ocsp.resp; - 配合 cron 定时更新(如每6小时),彻底规避内网网络抖动、Responder 临时不可用等问题。


















