SSL证书到期了才发现?提前30天提醒的监控方法,别再让用户看到"不安全"

5 阅读7分钟

SSL证书到期了才发现?提前30天提醒的监控方法,别再让用户看到"不安全"

摘要: SSL证书过期是个低频但高破坏的事故——浏览器红色"不安全"、SEO排名下滑、支付中断、用户流失。本文从 openssl 命令行到 SaaS 监控方案,给出一份可落地的 SSL 证书到期监控配置指南,帮你提前 30 天收到提醒。

适合人群: 后端开发、运维、站长、技术负责人

一、SSL 证书过期,到底有多痛

先说几个真实场景:

  • 某电商网站证书过期 4 小时,支付链路中断,单日 GMV 损失百万
  • 某 SaaS 产品证书过期,Chrome 地址栏直接显示"不安全",次日用户投诉量翻 5 倍
  • 某企业官网证书过期未及时续签,被搜索引擎降权,自然流量一个月才恢复

证书过期的危害不是"网站打不开"这么简单,而是一连串连锁反应:

  1. 浏览器红色警告:Chrome/Edge/Firefox 都会在地址栏标注"不安全",用户看到第一反应就是关掉
  2. 支付和 API 中断:第三方支付、小程序、移动端调用全部报错(SSL 握手失败)
  3. SEO 排名受损:Google 明确将 HTTPS 作为排名信号,证书失效会触发降权
  4. 用户信任崩塌:红色"不安全"对品牌信任的伤害,远超技术故障本身

更坑的是:证书过期这种事,永远不会被业务监控发现。你的服务进程在跑、端口在监听、接口返回正常,但用户就是访问不了——因为浏览器在握手阶段就拒绝了。

二、为什么人工记不住

很多人觉得"证书一年才过期一次,日历提醒一下不就行了"。真实情况是:

  • 证书数量多:一台服务器可能有主站、API、后台、子域名多张证书
  • 有效期越来越短:Let's Encrypt 证书只有 90 天,行业推动证书有效期向 90 天甚至更短演进
  • 签发时间不统一:不同时间续签的证书,到期日各不相同
  • 多域名/通配符证书:一张证书覆盖多个域名,过期影响面大
  • 团队交接遗漏:负责签证书的人离职了,交接清单里漏了

人脑记日历这件事,在证书管理上是不可靠的。必须自动化。

三、方案一:openssl 命令行手动检测

最基础的方法,用 openssl 看证书到期时间:

echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates

输出:

notBefore=Jan 15 00:00:00 2026 GMT
notAfter=Apr 15 00:00:00 2026 GMT

notAfter 就是到期时间。再算一下剩余天数:

EXPIRY=$(echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
DAYS_LEFT=$(( ($(date -d "$EXPIRY" +%s) - $(date -d "now" +%s)) / 86400 ))
echo "剩余天数: $DAYS_LEFT"

适合临时排查,但每天手动跑不现实。

四、方案二:脚本批量检测 + 定时任务

把上面的命令包成脚本,加个域名列表,丢到 cron 里:

#!/bin/bash
# ssl-check.sh
DOMAINS=("example.com" "api.example.com" "blog.example.com")
WARN_DAYS=30

for domain in "${DOMAINS[@]}"; do
    expiry=$(echo | openssl s_client -servername "$domain" -connect "$domain":443 2>/dev/null \
             | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
    if [ -z "$expiry" ]; then
        echo "[$domain] 获取证书失败"
        continue
    fi
    days_left=$(( ($(date -d "$expiry" +%s) - $(date -d "now" +%s)) / 86400 ))
    if [ "$days_left" -le "$WARN_DAYS" ]; then
        echo "[$domain] 证书将在 ${days_left} 天后过期,请及时续签"
        # 这里可以接邮件/微信通知
    fi
done

加到 crontab 每天跑一次:

0 9 * * * /path/to/ssl-check.sh >> /var/log/ssl-check.log

优点:免费、可控、数据在自己手里。

缺点

  • 只能从你自己的服务器探测,网络不通时检测不到
  • 告警渠道要自己接(邮件、微信、短信都得自己写)
  • 多服务器场景下,脚本要分发维护
  • 没有历史数据和趋势图
  • 证书突然被吊销(不是过期)这种异常,脚本不一定能发现

适合机器不多、有运维能力的团队。

五、方案三:在线检测工具

像 SSL Labs(ssllabs.com/ssltest)、MySSL(myssl.com)这类在线工具,输入域名就能看证书详情、到期时间、链路完整性、评级。

适合临时排查单个域名,但:

  • 没法批量
  • 没有定时告警
  • 不能集成到运维流程

六、方案四:专业监控 SaaS(推荐)

如果你的证书数量超过 5 张、或者希望"配一次就再也不用管",专业监控 SaaS 是更省心的选择。这类工具的核心能力是:

  • 定时探测:自动周期性检测证书状态
  • 到期提醒:提前 N 天通过邮件/微信/短信通知
  • 多节点判定:从不同地区同时检测,避免单点网络问题误判
  • 统一看板:所有证书状态、到期时间一目了然

快监控为例(一款轻量级可用性监控 SaaS,主打中小企业和开发者):

  • SSL 证书检测:支持 HTTPS 证书状态检测和到期监控
  • 多节点共识:京/沪/穗三节点同时探测,≥2/3 节点判定异常才告警,避免单点网络抖动误报
  • 告警渠道齐全:邮件、微信、短信(29 元档起送短信额度)
  • 免费版可用:5 个监控项免费,够监控个人站长的几张证书
  • 包月价格透明:29 元/49 元/99 元三档,没有按量计费的不确定性

配置流程大致是:注册账号 → 添加 HTTPS 监控任务 → 设置告警渠道 → 到期前自动收到提醒。

对于个人开发者,免费版基本够用;中小企业建议直接上 29 元档,20 个监控项 + 短信告警,证书监控和网站可用性监控一起做。

七、提前 30 天提醒,怎么配最合理

证书续签不是点一下就完事:

  • DV 证书:签发快,几分钟到几小时
  • OV/EV 证书:需要企业验证,1-3 天
  • 通配符证书:ACME 签发可能要配置 DNS 验证,半天到一天
  • 续签后还要部署、重启服务、验证链路

所以提前 30 天是个合理阈值:

  • 30 天:邮件提醒,进入"待办"状态
  • 15 天:微信提醒,开始准备续签
  • 7 天:短信提醒,必须处理
  • 3 天/1 天:紧急告警,再不处理就要出事

如果你的监控工具支持多级提醒,按这个节奏配最稳。如果不支持,至少保证 30 天前有一条短信能吵到你。

八、除了到期,SSL 还要盯什么

证书过期只是 SSL 故障的一种,完整的 SSL 监控还应该覆盖:

  • 证书链不完整:中间证书缺失,部分客户端报错
  • 证书被吊销:OCSP/CRL 状态异常
  • 协议版本过旧:TLS 1.0/1.1 已被主流浏览器废弃
  • 加密套件弱:使用了 RC4、3DES 等不安全算法
  • 域名不匹配:证书 CN/SAN 和访问域名不一致

如果你的监控工具只看"到期时间",建议搭配 SSL Labs 的深度检测定期跑一次,覆盖上述问题。

九、总结

SSL 证书过期是典型的"低频高破坏"事故,靠人记日历不靠谱。四种方案按需选:

方案适合成本
openssl 命令临时排查单个域名免费
脚本 + cron有运维能力的团队免费,但要维护
在线工具偶尔深度检测免费
监控 SaaS证书多、想省心免费版够用,付费 29 元起

核心原则就一条:别让用户比你先发现证书过期。提前 30 天提醒,留足续签时间,浏览器那个红色"不安全"就永远不会出现在你的用户面前。


本文提及的快监控:京/沪/穗三节点共识判定,支持 HTTP/TCP/DNS/SSL 检测,免费版 5 监控项,付费 29 元起,适合个人开发者和中小企业。