nginx 本身不支持内置自动化脚本,需通过外部脚本+cron定时任务实现ssl证书自动校验;方案包括:精准提取证书路径、验证本地证书链完整性与有效期、校验反向代理上游https证书、集成分级告警。

直接在 Nginx 内部写“自动化脚本”不可行——Nginx 本身不支持嵌入 Shell/Python 脚本或内置定时任务。所谓“Nginx 中配置自动化脚本”,实际是指:借助外部脚本 + 系统级定时任务(如 cron),结合 Nginx 配置文件结构和证书路径,实现对线上 SSL 证书的定期合法性校验。关键不是把脚本塞进 nginx.conf,而是让脚本能准确找到并验证 Nginx 正在使用的证书。
以下为可落地的四步方案,聚焦真实可用、避免踩坑:
✅ 从 Nginx 配置精准提取证书路径
不能依赖 nginx -T(输出混杂、无上下文、路径不绝对)。应解析原始配置文件:
- 先确认主配置路径:
CONF=$(nginx -V 2>&1 | grep "configure arguments:" | sed -n 's/.*--conf-path=\([^[:space:]]*\).*/\1/p') - 提取所有非注释、非空行中的
ssl_certificate指令值,支持引号包裹与空格:awk '/^[[:space:]]*ssl_certificate[[:space:]]+[^;#]/{gsub(/["'"'"'];?$/, "", $2); gsub(/^[[:space:]"]+|[[:space:]"]+$/, "", $2); if($2) print $2}' "$CONF" $(dirname "$CONF")/sites-enabled/* 2>/dev/null | sort -u - 将相对路径补全为绝对路径(基于
$CONF所在目录),过滤.pem/.crt/.cer文件,排除无效路径。
✅ 对每个证书文件做链完整性与顺序验证
单个 PEM 文件若含多张证书,必须满足:server cert → intermediate(s) → root(可选),且全部有效。用 OpenSSL 逐项检查:
- 是否至少含 1 张证书:
openssl crl2pkcs7 -nocrl -certfile "$CERT" | openssl pkcs7 -print_certs -noout | grep "subject=" | wc -l - 验证链能否追溯至系统信任库:
openssl verify -CAfile /etc/ssl/certs/ca-certificates.crt -untrusted - 检查每张证书有效期:
openssl x509 -in "$CERT" -noout -checkend 86400(是否 24 小时内过期)
✅ 同时校验远程端口证书(覆盖反向代理场景)
若 Nginx 作为反向代理,还需确认 upstream 的 HTTPS 服务证书合法:
- 对
proxy_pass https://backend.example.com目标执行:echo | openssl s_client -connect backend.example.com:443 -servername backend.example.com 2>/dev/null | \ openssl x509 -noout -text | grep -E "(Subject:|Issuer:|DNS:|Not After)"
- 验证其证书链是否完整、SAN 匹配
proxy_ssl_name、未过期,并能被proxy_ssl_trusted_certificate中的 CA 验证。
✅ 集成到 cron 并触发分级告警
- 将上述逻辑封装为脚本(如
/usr/local/bin/nginx-cert-check.sh),设为可执行; - 加入 crontab 每日执行:
0 3 * * * /usr/local/bin/nginx-cert-check.sh >> /var/log/nginx/cert-check.log 2>&1; - 告警逻辑建议分层:
- 剩余 ≤7 天 → 发邮件/企业微信提醒运维
- 链断裂、域名不匹配、签名无效 → 立即 Slack/钉钉报警 + 记录 error log
- 可选对接 Prometheus:暴露指标
nginx_ssl_cert_expires_in_seconds{domain="example.com"},由 Alertmanager 触发告警
不复杂但容易忽略。核心是路径提取要准、验证要全(本地链 + 远程端口 + 上游 CA)、告警要分等级。











