0

批量检查HTTPS证书到期时间脚本:Shell/Python/PowerShell三版通用

2026.05.25 | youres | 10次围观

批量检查HTTPS证书到期时间脚本:Shell/Python/PowerShell三版通用

HTTPS证书到期会导致网站无法被浏览器信任,甚至直接拦截访问,影响业务正常运行。手动逐个检查证书到期时间不仅效率低下,还容易遗漏,尤其是管理多个域名、多台服务器的时候,批量检查脚本就成了运维人员的必备工具。

本文提供Shell、Python、PowerShell三版通用脚本,支持跨平台批量检测HTTPS证书到期时间,可自定义提醒阈值,帮你彻底解决证书到期遗忘的痛点。

一、为什么需要批量检查HTTPS证书到期时间?

先说说几个常见的痛点,看看你有没有中招:

  • 手动用浏览器查看证书到期时间,几十个域名要花半天,还容易看错
  • 证书是第三方CA颁发的,到期前没有提醒,突然过期导致网站宕机
  • 管理多个子域名、通配符证书,不知道哪个先到期
  • 内网域名、测试环境的证书也容易遗漏,等到出问题才发觉

批量检查脚本可以一次性遍历所有域名,自动计算剩余有效期,剩余天数低于阈值(比如30天)时自动提醒,完全不用人工干预。

二、准备工作:先掌握单域名检查命令

批量脚本的核心逻辑是遍历域名+单域名检查证书有效期,所以先掌握单域名的检查命令,理解原理后再看脚本会轻松很多。

如果你习惯用curl,推荐先看这篇:curl测试网站HTTPS证书有效期命令:3种实用方法+PowerShell适配指南,里面详细讲了用curl获取证书有效期的各种姿势。

想获取证书的颁发机构、SAN扩展、加密算法等详细信息,参考这篇:curl获取SSL证书详细信息命令:从入门到实战的完整指南

如果需要查看证书的SAN字段(比如通配符证书覆盖的域名),看这篇:curl查看HTTPS证书信息命令:查看证书有效期、颁发机构和SAN的3种实用方法

下面先给出单域名检查的基础命令,作为批量脚本的核心逻辑:

# 方法1:用openssl获取证书到期时间(Linux/macOS通用)
openssl s_client -connect www.youres.cn:443 -servername www.youres.cn 2>/dev/null | openssl x509 -noout -dates

# 方法2:用curl获取证书到期时间(跨平台)
curl -v https://www.youres.cn 2>&1 | grep "expire date"

三、Shell版批量检查脚本(适用Linux/macOS)

Shell脚本适合Linux服务器运维场景,可以配合cron定时任务,每天自动检查并发送提醒。

1. 脚本代码(check_ssl_expire.sh)

#!/bin/bash
# 批量检查HTTPS证书到期时间脚本(Shell版)
# 使用方法:将域名写入domains.txt,每行一个,然后运行 ./check_ssl_expire.sh

# 定义阈值:剩余天数低于该值时提醒(单位:天)
THRESHOLD=30

# 读取域名列表文件
DOMAIN_FILE="domains.txt"

echo "开始批量检查HTTPS证书到期时间..."
echo "----------------------------------------"

# 遍历每个域名
while IFS= read -r domain || [ -n "$domain" ]; do
  # 跳过空行
  if [ -z "$domain" ]; then
    continue
  fi

  # 用openssl获取证书到期时间
  end_date=$(openssl s_client -connect "$domain:443" -servername "$domain" 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
  
  # 转换为时间戳
  end_timestamp=$(date -d "$end_date" +%s 2>/dev/null)
  if [ -z "$end_timestamp" ]; then
    echo "[错误] 无法获取域名 $domain 的证书信息"
    continue
  fi

  # 计算剩余天数
  current_timestamp=$(date +%s)
  remain_days=$(( (end_timestamp - current_timestamp) / 86400 ))

  # 输出结果
  if [ "$remain_days" -lt "$THRESHOLD" ]; then
    echo "[警告] 域名:$domain | 剩余天数:$remain_days 天 | 到期时间:$end_date"
  else
    echo "[正常] 域名:$domain | 剩余天数:$remain_days 天 | 到期时间:$end_date"
  fi
done < "$DOMAIN_FILE"

echo "----------------------------------------"
echo "批量检查完成"

2. 使用方法

  1. 创建域名列表文件domains.txt,每行写一个域名,比如:
    www.youres.cn
    blog.youres.cn
    api.youres.cn
  2. 给脚本添加执行权限:chmod +x check_ssl_expire.sh
  3. 运行脚本:./check_ssl_expire.sh

3. 优化:添加邮件提醒

可以在脚本末尾添加邮件发送逻辑,当有域名剩余天数低于阈值时自动发送邮件提醒运维人员,这里以sendmail为例:

# 在输出警告的地方添加邮件发送
if [ "$remain_days" -lt "$THRESHOLD" ]; then
  echo "域名 $domain 的HTTPS证书剩余 $remain_days 天到期,请及时处理!" | sendmail -v your@email.com
fi

四、Python版批量检查脚本(跨平台通用)

Python脚本最大的优势是跨平台,可以在Linux、Windows、macOS上运行,而且代码可读性更高,方便二次开发。

1. 脚本代码(check_ssl_expire.py)

#!/usr/bin/env python3
# 批量检查HTTPS证书到期时间脚本(Python版)
# 使用方法:将域名写入domains.txt,每行一个,然后运行 python3 check_ssl_expire.py
# 依赖:Python 3.6+(无需额外安装第三方库)

import socket
import ssl
from datetime import datetime, timezone
import csv

# 定义阈值:剩余天数低于该值时提醒(单位:天)
THRESHOLD = 30
# 域名列表文件
DOMAIN_FILE = "domains.txt"
# 输出CSV文件(可选)
OUTPUT_CSV = "ssl_expire_report.csv"

def get_ssl_expire_days(domain: str) -> tuple:
    """获取域名的HTTPS证书剩余有效天数"""
    context = ssl.create_default_context()
    try:
        with socket.create_connection((domain, 443), timeout=10) as sock:
            with context.wrap_socket(sock, server_hostname=domain) as ssock:
                cert = ssock.getpeercert()
                # 获取证书到期时间(UTC时间)
                expire_utc = datetime.strptime(cert["notAfter"], "%b %d %H:%M:%S %Y %Z").replace(tzinfo=timezone.utc)
                # 计算剩余天数
                now = datetime.now().replace(tzinfo=timezone.utc)
                remain_days = (expire_utc - now).days
                return remain_days, expire_utc.astimezone().strftime("%Y-%m-%d %H:%M:%S")
    except Exception as e:
        return None, str(e)

def main():
    print("开始批量检查HTTPS证书到期时间...")
    print("-" * 40)

    # 读取域名列表
    with open(DOMAIN_FILE, "r", encoding="utf-8") as f:
        domains = [line.strip() for line in f if line.strip()]

    # 存储结果
    results = []

    # 遍历域名
    for domain in domains:
        remain_days, info = get_ssl_expire_days(domain)
        if remain_days is None:
            print(f"[错误] 域名:{domain} | 错误信息:{info}")
            results.append([domain, "错误", info, ""])
        else:
            if remain_days < THRESHOLD:
                print(f"[警告] 域名:{domain} | 剩余天数:{remain_days} 天 | 到期时间:{info}")
            else:
                print(f"[正常] 域名:{domain} | 剩余天数:{remain_days} 天 | 到期时间:{info}")
            results.append([domain, remain_days, info, "需要续期" if remain_days < THRESHOLD else "正常"])

    print("-" * 40)
    print("批量检查完成")

    # 导出为CSV(可选)
    with open(OUTPUT_CSV, "w", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["域名", "剩余天数", "到期时间", "状态"])
        writer.writerows(results)
    print(f"检查结果已导出到 {OUTPUT_CSV}")

if __name__ == "__main__":
    main()

2. 使用方法

  1. 确保已安装Python 3.6+(Linux/macOS自带,Windows需要手动安装)
  2. 创建域名列表文件domains.txt,格式和Shell版一致
  3. 运行脚本:python3 check_ssl_expire.py
  4. 检查结果会自动导出为ssl_expire_report.csv,方便统计和存档

五、PowerShell版批量检查脚本(适用Windows)

Windows运维人员不用切换到Linux环境,直接用PowerShell脚本就能批量检查,完美适配Windows Server的Task Scheduler(任务计划程序)。

1. 脚本代码(check_ssl_expire.ps1)

# 批量检查HTTPS证书到期时间脚本(PowerShell版)
# 使用方法:将域名写入domains.txt,每行一个,然后运行 .\check_ssl_expire.ps1
# 适用环境:PowerShell 5.1+ / PowerShell 7+

# 定义阈值:剩余天数低于该值时提醒(单位:天)
$THRESHOLD = 30
# 域名列表文件
$DOMAIN_FILE = "domains.txt"

Write-Host "开始批量检查HTTPS证书到期时间..."
Write-Host "----------------------------------------"

# 读取域名列表
$domains = Get-Content $DOMAIN_FILE | Where-Object { $_.Trim() -ne "" }

# 遍历每个域名
foreach ($domain in $domains) {
    $domain = $domain.Trim()
    try {
        # 创建TCP连接
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        $tcpClient.Connect($domain, 443)
        
        # 创建SSL流
        $sslStream = New-Object System.Net.Security.SslStream($tcpClient.GetStream(), $false)
        $sslStream.AuthenticateAsClient($domain)
        
        # 获取证书
        $cert = $sslStream.RemoteCertificate
        $x509Cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($cert)
        
        # 计算剩余天数
        $expireDate = $x509Cert.NotAfter
        $remainDays = ($expireDate - (Get-Date)).Days
        
        # 输出结果
        if ($remainDays -lt $THRESHOLD) {
            Write-Host "[警告] 域名:$domain | 剩余天数:$remainDays 天 | 到期时间:$expireDate" -ForegroundColor Red
        } else {
            Write-Host "[正常] 域名:$domain | 剩余天数:$remainDays 天 | 到期时间:$expireDate" -ForegroundColor Green
        }
        
        # 释放资源
        $sslStream.Close()
        $tcpClient.Close()
    } catch {
        Write-Host "[错误] 无法获取域名 $domain 的证书信息:$_" -ForegroundColor Yellow
    }
}

Write-Host "----------------------------------------"
Write-Host "批量检查完成"

2. 使用方法

  1. 创建域名列表文件domains.txt,格式和前两个版本一致
  2. 打开PowerShell,切换到脚本所在目录
  3. 运行脚本:.\check_ssl_expire.ps1
  4. 如果提示“无法加载文件,因为在此系统上禁止运行脚本”,以管理员身份运行PowerShell,执行Set-ExecutionPolicy RemoteSigned,然后重新运行脚本

3. 优化:添加企业微信/钉钉提醒

Windows环境下可以很方便地调用企业微信、钉钉的Webhook接口,当有证书快到期时发送群消息提醒,比如企业微信Webhook的调用方法:

# 在警告输出的地方添加Webhook调用
if ($remainDays -lt $THRESHOLD) {
    $webhookUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
    $body = @{
        msgtype = "text"
        text = @{
            content = "警告:域名 $domain 的HTTPS证书剩余 $remainDays 天到期,请及时处理!"
        }
    } | ConvertTo-Json
    Invoke-RestMethod -Uri $webhookUrl -Method Post -Body $body -ContentType "application/json; charset=utf-8"
}

六、常见问题排查

  1. 脚本运行报错“连接超时”怎么办?
    检查域名是否正确、443端口是否开放、服务器防火墙是否允许出站连接,如果是内网域名,确保脚本运行环境能访问内网。
  2. 通配符证书怎么检查?
    直接填写通配符的主域名即可,比如*.youres.cn直接写youres.cn,脚本会自动检查主域名的证书,通配符证书对子域名生效。
  3. 证书是Let's Encrypt的,3个月有效期,怎么自动续期?
    可以配合certbot的自动续期功能,脚本只需要检查续期是否成功即可,不用手动更换证书。
  4. 内网自签名证书能不能检查?
    可以,Shell版和Python版需要添加-insecure或者忽略证书验证的逻辑,PowerShell版需要添加证书验证的回调,跳过不受信任的证书检查。

七、总结

本文提供的三版脚本覆盖了几乎所有运维场景:

  • Linux服务器运维优先选Shell版,配合cron定时任务,轻量高效
  • 跨平台需求、需要导出报表选Python版,代码清晰易维护
  • Windows Server运维选PowerShell版,完美适配任务计划程序,还能调用Windows生态的各种提醒工具

建议根据自己的实际场景选择对应版本,定期运行脚本,提前30天以上处理快到期的证书,彻底避免证书到期导致的业务故障。

如果还有其他证书管理的问题,欢迎在评论区留言讨论。

版权声明

本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论
883文章数 0评论数
作者其它文章