Nginx证书链怎么编写Shell脚本校验Nginx线上所有站点的证书链有效期

浅涛姑娘_5894

浅涛姑娘_5894

2026-09-24

156人浏览

原创

可用shell脚本结合openssl和curl批量检查nginx线上站点证书有效期:先从nginx配置提取https域名与端口,再用openssl s_client获取并解析叶子证书的notbefore/notafter时间,最后对比当前时间输出过期、预警或正常状态。

nginx证书链怎么编写shell脚本校验nginx线上所有站点的证书链有效期

<p>可以用 Shell 脚本结合 <code>openssl</code> 和 <code>curl</code> 批量检查 Nginx 线上所有站点的证书链有效期。核心思路是:从 Nginx 配置中提取 server_name 和监听端口(含 HTTPS),对每个域名+端口发起 TLS 握手,获取并验证证书链中**叶子证书**的有效期(通常只需关注终端证书,中间证书一般远长于叶子证书)。</p>

<h3>1. 提取 Nginx 配置中的 HTTPS 站点</h3>
<p>遍历 <code>/etc/nginx/sites-enabled/</code> 或主配置包含的 conf 文件,找出启用 SSL 的 <code>server</code> 块及其域名、端口:</p>
  • 匹配 listen *:443 ssl; 或 listen 443 ssl;
  • 提取 server_name 后的域名(支持多个,空格或分号分隔)
  • 跳过注释行和 include 行,忽略纯 IP 监听或无 server_name 的配置

示例命令片段(用于生成待测域名列表):

nginx -t &>/dev/null || { echo "Nginx config invalid"; exit 1; }
grep -r "listen.*443.*ssl" /etc/nginx/sites-enabled/ --include="*.conf" | \
  awk -F':' '{print $1}' | sort -u | \
  while read conf; do
    awk '/^[[:space:]]*server[[:space:]]*{/,/^[[:space:]]*}/ {
      if (/^[[:space:]]*listen[[:space:]]+[0-9]+:[[:space:]]*443[[:space:]]+ssl/) ssl=1;
      if (/^[[:space:]]*server_name/ && ssl) {
        gsub(/;/,"",$0); gsub(/server_name[[:space:]]+/,"",$0);
        for(i=1;i

2. 对每个域名执行证书有效期检查

使用 openssl s_client 连接 443 端口(可加 -servername 支持 SNI),提取 PEM 格式证书链,再用 openssl x509 解析第一张(叶子)证书的生效与过期时间:

Nginx Config Linter
Nginx Config Linter

对 Nginx 配置文件进行语法检查、验证和安全、性能审计。

下载
  • 超时设为 5 秒(-timeout 5),避免卡住
  • 忽略验证错误(-verify_return_error 不启用),只关心能否拿到证书
  • 用 awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' 提取首张证书
  • 用 openssl x509 -noout -dates 输出 notBefore 和 notAfter

关键检查逻辑(单域名):

domain="example.com"
if ! cert=$(echo | openssl s_client -connect "$domain:443" -servername "$domain" -timeout 5 2>/dev/null | \
           sed -n '/BEGIN CERTIFICATE/,/END CERTIFICATE/p' | head -n +200); then
  echo "$domain: connect failed or no cert"
  continue
fi
if ! not_after=$(echo "$cert" | openssl x509 -noout -enddate 2>/dev/null | cut -d'=' -f2-); then
  echo "$domain: invalid cert format"
  continue
fi
# 转为秒级时间戳比较(Linux GNU date)
expire_ts=$(date -d "$not_after" +%s 2>/dev/null)
now_ts=$(date +%s)
if [ -z "$expire_ts" ] || [ "$expire_ts" -lt "$now_ts" ]; then
  echo "$domain: EXPIRED or parse failed"
elif [ "$expire_ts" -lt $((now_ts + 30*86400)) ]; then
  echo "$domain: expires in $(($(($expire_ts - $now_ts)) / 86400)) days ⚠️"
else
  echo "$domain: OK ($(($(($expire_ts - $now_ts)) / 86400)) days left)"
fi

3. 完整脚本要点(可直接保存运行)

整合上述逻辑,加入错误处理、去重、跳过内网/localhost 域名,并支持自定义端口(如 8443):

  • 先用 nginx -T 导出全部生效配置,避免手动找路径遗漏
  • 用 grep -v "127.0.0.1\|localhost\|::1" 过滤本地测试域名
  • 对每个域名尝试 dig +short A $domain | head -1 确保 DNS 可解析(可选)
  • 输出 CSV 或着色文本,便于人工或后续告警(如发邮件给运维)
  • 建议搭配 cron 每周执行一次:0 2 * * 1 /path/to/check-certs.sh >> /var/log/cert-check.log 2>&1

4. 注意事项

真实环境需考虑:

  • 多端口:若站点用非标准 HTTPS 端口(如 8443),需在提取配置时一并捕获 listen 8443 ssl 并记录端口
  • SNI 必须开启:OpenSSL 默认发 SNI,但某些老旧 Nginx 或 CDN(如 Cloudflare)可能返回默认证书,需确认是否符合预期
  • 证书链完整性:该脚本只校验叶子证书;若需检查整个链(如中间 CA 是否缺失),可用 openssl s_client -showcerts + 多次 x509 -noout -text 分析,但实际运维中叶子证书过期才是主要风险点
  • 权限问题:脚本应以能读取 Nginx 配置的用户(如 root 或 nginx 组)运行;生产环境不建议直接用 root,可用 sudo -u nginx 限定权限

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

nginx shell脚本

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

383

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3027

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

5525

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

541

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1456

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3898

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

417

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

139

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习