本文目录导读:

自动化守护网站安全的黄金准则
目录导读
- 为什么SSL证书到期提醒如此重要?
- 定时检查证书到期脚本的常见实现方式
- 核心脚本代码示例与详解
- 常见问题与解决方案(Q&A)
- 最佳实践与部署建议
为什么SSL证书到期提醒如此重要?
在网站运营中,SSL证书的有效期已经从过去的三年缩短到目前的1年,部分证书甚至只有90天,一旦证书过期,浏览器会直接显示“不安全”警告,轻则影响用户信任,重则导致业务中断,根据Google的研究,超过80%的用户在遇到证书过期页面时会直接关闭网站。定时检查证书到期并提醒脚本成为网站管理员的必备工具。
定时检查证书到期脚本的常见实现方式
目前业界主流方案包括:
- Shell脚本 + cron定时任务:轻量级,适用于Linux服务器,直接调用openssl命令解析证书信息。
- Python脚本 + 邮件或WebHook通知:可扩展性强,支持钉钉、企微、Slack等通道。
- Node.js/Go方案:适合大型集群的集中式监控。
为了平衡易用性与可靠性,本文推荐使用Shell脚本 + cron + 邮件告警的组合——无需额外依赖,几乎零成本。
核心脚本代码示例与详解
以下是一段经过优化的Shell脚本(适用于CentOS/Ubuntu),它会每天检查证书剩余天数,并发送邮件提醒:
#!/bin/bash
# 配置:要监控的域名列表
DOMAINS=("example.com" "blog. example.com" "shop. example.com")
# 配置:告警阈值(天数)
WARN_DAYS=30
EMAIL="admin@example.com"
# 配置:邮件发送命令(假设使用mailx)
MAIL_CMD="mail -s"
# 配置:钉钉机器人WebHook(可选)
DINGTALK_TOKEN="your_dingtalk_token"
# 循环检查每个域名
for DOMAIN in "${DOMAINS[@]}"; do
# 获取证书过期时间(秒)
EXPIRY_DATE=$(echo | openssl s_client -servername "$DOMAIN" -connect "$DOMAIN":443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
if [ -z "$EXPIRY_DATE" ]; then
echo "[ERROR] 无法获取 $DOMAIN 的证书信息" | $MAIL_CMD "证书检查失败 - $DOMAIN" $EMAIL
continue
fi
# 转为时间戳
EXPIRY_TS=$(date -d "$EXPIRY_DATE" +%s)
NOW_TS=$(date +%s)
REMAIN_DAYS=$(( ($EXPIRY_TS - $NOW_TS) / 86400 ))
# 判断是否需要告警
if [ $REMAIN_DAYS -le 0 ]; then
SUBJECT="[紧急] $DOMAIN 证书已过期!"
MESSAGE="域名 $DOMAIN 的SSL证书已于 $EXPIRY_DATE 过期,请立即更新!"
elif [ $REMAIN_DAYS -le $WARN_DAYS ]; then
SUBJECT="[警告] $DOMAIN 证书将在 $REMAIN_DAYS 天后过期"
MESSAGE="域名 $DOMAIN 的SSL证书将于 $EXPIRY_DATE 到期,剩余 $REMAIN_DAYS 天,请及时续费。"
else
# 正常状态,跳过告警
continue
fi
# 发送邮件
echo "$MESSAGE" | $MAIL_CMD "$SUBJECT" $EMAIL
# 可选:发送钉钉消息
if [ -n "$DINGTALK_TOKEN" ]; then
curl -s -X POST "https://oapi.dingtalk.com/robot/send?access_token=$DINGTALK_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$SUBJECT\n$MESSAGE\"}}" >/dev/null 2>&1
fi
done
使用前操作:
- 将脚本保存为
check_ssl.sh。 - 添加执行权限:
chmod +x check_ssl.sh。 - 设置crontab:
0 8 * * * /path/to/check_ssl.sh(每天早上8点执行)。
常见问题与解决方案(Q&A)
Q1:为什么我运行脚本时提示“openssl: command not found”?
A:脚本依赖openssl工具,在Ubuntu/Debian中执行 sudo apt install openssl,在CentOS/RHEL中执行 sudo yum install openssl 即可。
Q2:我不想用邮件发送,可以换成企业微信机器人吗?
A:完全可以,只需将脚本中的$MAIL_CMD部分替换为curl调用企业微信WebHook。
curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"**$SUBJECT**\n$MESSAGE\"}}"
Q3:我有多台服务器需要统一监控,怎么办?
A:推荐两种方式:
- 中央监控方案:在一台监控机上安装脚本,定时扫描所有目标服务器的443端口(需确保网络可达)。
- 分布部署方案:每台服务器独立运行脚本,最终汇总告警到同一个通知通道。
Q4:脚本每天执行一次,如果当天证书过期但检查间隔内失效怎么办?
A:建议将crontab调整为每6小时或每4小时检查一次,更保险的做法是部署“主动监测+被动回调”组合,例如配合第三方监控平台(如UptimeRobot)的证书到期告警API。
最佳实践与部署建议
要让定时检查证书到期并提醒脚本真正发挥“安全守门员”作用,请遵循以下原则:
-
分级告警策略:设置30天、14天、7天、3天、1天多个阈值,避免一次性惊动。
- 30天:邮件提醒管理员。
- 14天:邮件+钉钉群消息。
- 7天:电话告警(通过API调用腾讯云或阿里云的电话通知服务)。
-
避免“告警疲劳”:对同一个域名不要发送重复状态的提示,可以在脚本中加入状态缓存文件,仅当剩余天数跨越阈值时才触发通知。
-
兼容不同证书类型:通配符证书(
*.example.com)和多域名证书(SAN证书)同样适用以上脚本,只需将每个具体域名加入DOMAINS数组即可。 -
日志记录:在脚本头部增加日志输出,
LOG_FILE="/var/log/ssl_check.log" echo "[$(date)] Checking $DOMAIN: $REMAIN_DAYS days left" >> $LOG_FILE
方便事后溯源。
-
考虑使用HashiCorp Vault或KMS:对于大型企业,可以将证书私钥和提醒逻辑统一管理在Secret Store中,避免脚本直接硬编码敏感信息。
通过以上综合搜索引擎现有资料提炼的方案,您可以在极低成本下构建一套可靠的证书到期自动提醒体系。证书过期不是技术问题,而是管理问题——一个好的定时检查脚本,就是那个永远不会忘记的“数字闹钟”。