批量检查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. 使用方法
- 创建域名列表文件
domains.txt,每行写一个域名,比如:www.youres.cn blog.youres.cn api.youres.cn - 给脚本添加执行权限:
chmod +x check_ssl_expire.sh - 运行脚本:
./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. 使用方法
- 确保已安装Python 3.6+(Linux/macOS自带,Windows需要手动安装)
- 创建域名列表文件
domains.txt,格式和Shell版一致 - 运行脚本:
python3 check_ssl_expire.py - 检查结果会自动导出为
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. 使用方法
- 创建域名列表文件
domains.txt,格式和前两个版本一致 - 打开PowerShell,切换到脚本所在目录
- 运行脚本:
.\check_ssl_expire.ps1 - 如果提示“无法加载文件,因为在此系统上禁止运行脚本”,以管理员身份运行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"
}
六、常见问题排查
-
脚本运行报错“连接超时”怎么办?
检查域名是否正确、443端口是否开放、服务器防火墙是否允许出站连接,如果是内网域名,确保脚本运行环境能访问内网。 -
通配符证书怎么检查?
直接填写通配符的主域名即可,比如*.youres.cn直接写youres.cn,脚本会自动检查主域名的证书,通配符证书对子域名生效。 -
证书是Let's Encrypt的,3个月有效期,怎么自动续期?
可以配合certbot的自动续期功能,脚本只需要检查续期是否成功即可,不用手动更换证书。 -
内网自签名证书能不能检查?
可以,Shell版和Python版需要添加-insecure或者忽略证书验证的逻辑,PowerShell版需要添加证书验证的回调,跳过不受信任的证书检查。
七、总结
本文提供的三版脚本覆盖了几乎所有运维场景:
- Linux服务器运维优先选Shell版,配合cron定时任务,轻量高效
- 跨平台需求、需要导出报表选Python版,代码清晰易维护
- Windows Server运维选PowerShell版,完美适配任务计划程序,还能调用Windows生态的各种提醒工具
建议根据自己的实际场景选择对应版本,定期运行脚本,提前30天以上处理快到期的证书,彻底避免证书到期导致的业务故障。
如果还有其他证书管理的问题,欢迎在评论区留言讨论。
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论