批量检测域名ocsp stapling状态需用openssl 1.0.2+执行s_client命令检查status_request扩展响应;脚本逐行读取domains.txt,通过-tlsextdebug和grep“ocsp response:”判断启用与否,并提示nginx配置要点及优化建议。

要批量检测多个域名的 OCSP Stapling 启用状态,核心思路是:对每个域名发起 TLS 握手,检查 Server Hello 中是否携带了 status_request 扩展响应(即 OCSP Stapling 数据)。Nginx 本身不提供直接的“批量检测”命令,需借助外部工具(如 openssl s_client)配合 Shell 脚本完成。
准备前提:确保环境支持 OCSP 检测
OpenSSL 版本需 ≥ 1.0.2(推荐 1.1.1 或更新),且编译时启用了 OCSP 支持(主流发行版默认满足)。执行以下命令验证:
-
openssl version -a | grep -i ocsp—— 应有enable-ocsp字样 -
openssl s_client -help 2>&1 | grep -q status_request && echo "OK"—— 无输出则不支持
编写批量检测脚本(Shell + openssl)
以下为轻量、可靠、可直接运行的 Bash 脚本,支持读取域名列表并逐个检测 OCSP Stapling 是否生效:
#!/bin/bash
# save as: check_ocsp.sh
# usage: chmod +x check_ocsp.sh && ./check_ocsp.sh domains.txt
<p>DOMAINS_FILE="${1:-domains.txt}"</p><p>if [[ ! -f "$DOMAINS_FILE" ]]; then
echo "Error: Domains file '$DOMAINS_FILE' not found."
exit 1
fi</p><p>while IFS= read -r domain; do
[[ -z "$domain" || "$domain" =~ ^[[:space:]]<em># ]] && continue
domain=$(echo "$domain" | sed 's/^[[:space:]]</em>//; s/[[:space:]]*$//')</p><p>echo -n "[$domain] OCSP Stapling: "</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter"><img
src="https://img.php.cn/upload/skill/000/000/081/178955659937208.jpg" alt="Nginx Config Linter" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter" class="overflowclass">Nginx Config Linter</a>
<p class="overflowclass">对 Nginx 配置文件进行语法检查、验证和安全、性能审计。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3427" title="Nginx Config Linter" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><h1>尝试 443 端口,超时 5 秒,仅检查 TLS 握手和 stapling 响应</h1><p>if timeout 5 openssl s_client -connect "$domain:443" -servername "$domain" \
-status -tlsextdebug 2>/dev/null | grep -q "OCSP response:"; then
echo "<font color="green">✅ Enabled</font>"
else
echo "<font color="red">❌ Disabled or Timeout</font>"
fi
done </p><p>使用方式:</p>
- 新建
domains.txt,每行一个域名(如example.com、api.your-site.net),支持注释(以#开头) - 赋予执行权限:
chmod +x check_ocsp.sh - 运行:
./check_ocsp.sh domains.txt
Nginx 配置中启用 OCSP Stapling 的关键项
脚本检测的是实际生效状态,而非配置是否存在。若结果多为 ❌,请检查 Nginx SSL 配置是否包含以下必需指令:
-
ssl_stapling on;—— 启用 Stapling 功能 -
ssl_stapling_verify on;—— 强制验证 OCSP 响应签名(推荐开启) -
ssl_trusted_certificate /path/to/full_chain.pem;—— 必须指定含根证书和中间证书的完整信任链(不能只用ssl_certificate) -
resolver 8.8.8.8 1.1.1.1 valid=300s;—— 必须配置 DNS 解析器,且不可用127.0.0.1(除非本地运行可信 DNS) -
resolver_timeout 5s;—— 避免因 DNS 延迟导致 stapling 失败
注意:Nginx 在首次请求后才开始缓存 OCSP 响应,首次检测可能延迟或失败,建议等待 1–2 分钟后再运行脚本复测。
进阶建议:提升检测准确性与效率
生产环境可进一步优化检测逻辑:
- 添加 HTTP Host 头探测(
curl -I --resolve domain:443:IP https://domain)辅助判断是否真实响应 HTTPS - 用
parallel替代 while 循环实现并发检测(如cat domains.txt | parallel -j10 ./check_single.sh) - 将结果导出为 CSV 或 JSON,便于后续统计启用率(例如:启用数 / 总域名数 × 100%)
- 结合 Prometheus + nginx_exporter,通过
nginx_ssl_handshake_status{stapling="1"}指标长期监控(需自定义指标暴露)










