Nginx 不支持定时任务和自动 OCSP 更新,需通过外部脚本定期生成 DER 格式 OCSP 响应文件并原子替换 ssl_stapling_file 指向的文件,Nginx 在 TLS 握手时实时读取该文件实现零延迟更新。

Nginx 本身不支持定时任务,也不提供内置的 OCSP 响应自动拉取与注入机制。所谓“定时离线获取并注入缓存”,本质是**用外部脚本定期生成合法 DER 格式 OCSP 响应文件,再由 Nginx 通过 ssl_stapling_file 零延迟加载**——不是 Nginx 自己缓存或刷新,而是你主动替换文件。
核心逻辑:文件替换即“更新缓存”
Nginx 启动或重载时读取一次 ssl_stapling_file 指向的 DER 文件;之后只要该文件存在、未过期、签名可验,Nginx 就持续使用它。因此“定时更新”只需做到:
- 用
openssl ocsp定期请求最新响应,输出为二进制 DER 文件(不是 PEM) - 确保新文件权限为 Nginx 工作进程可读(如
www-data或nginx用户) - 原子化替换(推荐用
mv而非cp),避免 Nginx 读到损坏中间态
必备前提:证书与环境已就绪
在写定时任务前,请确认以下五项全部满足,否则脚本即使执行成功,Nginx 也不会生效:
- 你的域名证书含有效 OCSP URI(运行
openssl x509 -in cert.pem -text -noout | grep -A1 "OCSP"可查) -
ssl_trusted_certificate指向完整中间链(中间 CA 在前、根 CA 在后),且不含站点证书 - 服务器时间偏差 ≤ ±5 分钟(
date对比权威时间) - Nginx ≥ 1.3.7,OpenSSL ≥ 1.0.1(建议 1.1.1+)
- OCSP 响应器域名(如
ocsp.int-x3.letsencrypt.org)能从服务器正常解析并访问(非必须,但影响脚本拉取)
定时脚本示例(以 Let’s Encrypt 为例)
保存为 /usr/local/bin/update-ocsp.sh,并赋予可执行权限:
#!/bin/bash
CERT="/etc/letsencrypt/live/example.com/fullchain.pem"
KEY="/etc/letsencrypt/live/example.com/privkey.pem"
CHAIN="/etc/letsencrypt/live/example.com/chain.pem"
OCSP_FILE="/var/lib/nginx/ocsp/example.com.ocsp"
TRUSTED_CA="/etc/nginx/ssl/full-chain-trusted.pem" # 仅含中间+根,顺序正确
<h1>提取证书和 issuer(需适配实际路径)</h1><p>DOMAIN_CERT="/etc/letsencrypt/live/example.com/cert.pem"
ISSUER_CERT="$CHAIN"</p><h1>请求新 OCSP 响应(DER 格式)</h1><p>if openssl ocsp -issuer "$ISSUER_CERT" \
-cert "$DOMAIN_CERT" \
-url <a href="https://www.php.cn/link/54b827599268bd42f5c04f317a0e0cf5">https://www.php.cn/link/54b827599268bd42f5c04f317a0e0cf5</a> \
-header "HOST" "ocsp.int-x3.letsencrypt.org" \
-respout "$OCSP_FILE.tmp" \
-noverify 2>/dev/null; then</p><h1>验证响应有效性(关键!防止写入过期/无效数据)</h1><pre class="brush:php;toolbar:false;">if openssl ocsp -respin "$OCSP_FILE.tmp" -CAfile "$TRUSTED_CA" -text 2>/dev/null | \
grep -q "Response verify OK" && \
openssl ocsp -respin "$OCSP_FILE.tmp" -CAfile "$TRUSTED_CA" -text 2>/dev/null | \
grep -q "Next Update.*$(date -d '+1 hour' '+%b %d %H:%M:%S %Y GMT')"; then
mv "$OCSP_FILE.tmp" "$OCSP_FILE"
chown www-data:www-data "$OCSP_FILE"
chmod 644 "$OCSP_FILE"
else
rm -f "$OCSP_FILE.tmp"
exit 1
fielse rm -f "$OCSP_FILE.tmp" exit 1 fi
说明:
- 使用
-noverify是因网络请求阶段不校验签名,后续用openssl ocsp -respin独立验证更可靠 -
grep "Next Update"判断是否在有效期内(此处简化为检查是否在未来 1 小时内,实际可更严格) -
chown和chmod确保 Nginx 进程有读权限
配置 cron 定时执行
运行 crontab -e,添加一行(例如每 4 小时更新一次):
0 */4 * * * /usr/local/bin/update-ocsp.sh >> /var/log/ocsp-update.log 2>&1
Nginx 不需要 reload —— 它每次 TLS 握手时自动读取当前 ssl_stapling_file 文件内容,只要文件合法,立即生效。
不复杂但容易忽略











