核心思路是用openssl s_client批量抓取远程SSL证书,再通过openssl x509解析notAfter字段获取到期时间,绕过交互、处理超时与验证错误;基础命令为echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate | cut -d' ' -f4-,并可扩展为支持超时、重试、天数计算与邮件告警的Shell脚本。

核心思路:批量获取证书并解析到期时间
不依赖图形界面或复杂工具,用 openssl s_client 抓取远程服务器的SSL证书,再通过 openssl x509 解析有效期。关键在于绕过交互式连接、处理超时、跳过验证错误,并统一提取 notAfter 字段。
基础命令链:单站证书到期时间提取
以下是一行可直接执行的命令,适用于大多数支持 TLS 的网站:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate | cut -d' ' -f4-
说明:
-
echo |提供空输入,避免 openssl 等待手动输入 -
-connect host:port指定目标域名和端口(默认443) -
2>/dev/null屏蔽警告(如证书链不完整、名称不匹配) -
-noout -enddate只输出证书过期时间,格式如Jul 15 12:34:56 2025 GMT
批量轮询脚本:支持超时、失败重试与结果归档
保存为 check-certs.sh,赋予执行权限(chmod +x check-certs.sh):
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
#!/bin/bash
# 网站列表,每行一个域名(可带端口,如 api.example.com:8443)
SITES_FILE="sites.txt"
LOG_FILE="cert_check_$(date +%Y%m%d).log"
while IFS= read -r site; do
[[ -z "$site" || "$site" =~ ^[[:space:]]*# ]] && continue
# 提取主机和端口,默认443
if [[ "$site" == *":"* ]]; then
host="${site%%:*}"
port="${site##*:}"
else
host="$site"
port="443"
fi
# 设置5秒超时,最多尝试2次
expiry=$(timeout 5 bash -c "echo | openssl s_client -connect '$host:$port' -servername '$host' 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null" 2>/dev/null | cut -d' ' -f4-)
if [[ -n "$expiry" ]]; then
# 转换为秒级时间戳便于计算剩余天数
expiry_sec=$(date -d "$expiry" +%s 2>/dev/null)
if [[ $? -eq 0 ]]; then
now_sec=$(date +%s)
days_left=$(( (expiry_sec - now_sec) / 86400 ))
echo "$(date '+%F %T') OK $host:$port → expires on $expiry ($days_left days left)" >> "$LOG_FILE"
if [[ $days_left -le 15 ]]; then
echo "$(date '+%F %T') ALERT $host:$port → expires in $days_left days!" >> alert.log
fi
else
echo "$(date '+%F %T') ERROR $host:$port → invalid expiry format" >> "$LOG_FILE"
fi
else
echo "$(date '+%F %T') FAILED $host:$port → connection or parse failed" >> "$LOG_FILE"
fi
done
说明要点:
-
-servername参数启用 SNI,对虚拟主机环境必需 -
timeout 5防止卡死在慢响应或无响应站点 - 自动识别端口,兼容非标准 HTTPS 端口(如 8443)
- 单独生成
alert.log,方便用tail -f alert.log实时盯梢高风险证书
集成到定时任务与告警闭环
将监控纳入系统级调度:
- 添加 crontab 条目(每天凌晨2点执行):
0 2 * * * /path/to/check-certs.sh >/dev/null 2>&1 - 配合简单邮件告警(在脚本末尾加):
if [[ -s alert.log ]]; then mail -s "SSL Cert Alert $(date +%F)" admin@example.com alert.log; fi - 进阶可对接 Slack 或企业微信 Webhook:用
curl -X POST发送 JSON 消息
注意:生产环境建议搭配证书透明度(CT)日志或专业工具(如 sslyze、certigo)做交叉验证,Shell 方案适合轻量、快速落地场景。

















