国密证书过期监控告警方案如下:
一、背景与合规要求
国密SSL证书的有效期遵循全球统一的证书生命周期管理政策,当前最长有效期为398天(约13个月),国际证书和国密证书均适用此标准。值得关注的是,根据CA/B论坛通过的新规,证书有效期将逐年缩短,预计到2029年全面实施后,最大有效期将缩短至47天。这意味着证书过期监控告警的重要性将愈发凸显。
从合规角度来看,根据《中华人民共和国密码法》、《商用密码管理条例》及《GB/T 39786-2021 信息系统密码应用基本要求》等法规,关键信息基础设施和等保三级及以上系统必须使用商用密码进行保护,并需定期进行密码应用安全性评估。证书有效期监控是密评合规的重要检查项之一,过期或即将过期的国密证书可能导致业务中断以及等保测评不达标的风险。
二、证书过期监控告警的三种方案路径
国密证书的过期监控有多种实现路径,可按企业规模和运维能力进行选择:
方案一:云服务商自带证书告警(开箱即用)
各大云服务商均提供证书到期告警功能,以华为云为例,VPN企业版支持以下事件监控告警:
事件名称 触发条件 事件级别 说明
VPNCertificatePreExpire60Days 证书60天后过期 重要 国密证书到期告警
VPNCertificatePreExpire30Days 证书30天后过期 重要 国密证书到期告警
VPNCertificatePreExpire15Days 证书15天后过期 重要 国密证书到期告警
VPNCertificatePreExpire7Days 证书7天后过期 紧急 国密证书到期告警
VPNCertificatePreExpire3Days 证书3天后过期 紧急 国密证书到期告警
VPNCertificatePreExpire1Day 证书1天后过期 紧急 国密证书到期告警
VPNCertificateExpire 证书已过期 紧急 国密证书到期告警,业务中断
腾讯云SSL证书控制台也提供了证书监控告警功能,可在左侧导航栏选择"证书监控" → "告警设置",创建告警策略,策略类型选择"SSL证书",支持自定义告警阈值。
方案二:企业级监控系统(Zabbix/Prometheus)
对于需要统一监控多个域名和服务的企业,推荐使用Zabbix或Prometheus等企业级监控系统集中管理。
Zabbix实现方案:通过外部检查调用脚本获取证书剩余天数并触发告警。
Prometheus实现方案:通过x509-certificate-exporter采集证书指标,配合Alertmanager进行告警通知。
方案三:轻量级脚本监控(中小规模部署)
使用Shell或Python脚本定时检查证书有效期,通过邮件、企业微信或钉钉机器人推送告警。该方案适合中小规模部署或无现有监控系统的小团队。
三、Zabbix监控国密证书方案
3.1 脚本创建
在Zabbix的`externalscripts`目录下创建证书检查脚本:
bash
# vi /usr/local/zabbix/share/zabbix/externalscripts/check_ssl.sh
#!/bin/bash
# 获取证书剩余有效天数
time=$(echo | openssl s_client -connect $1:443 2>/dev/null | openssl x509 -noout -dates | awk -F'=' 'NR==2{print $2}')
times=$((($(date +%s -d "$time")-$(date +%s))/(60*60*24)))
echo $times
国密证书特别说明:上述脚本使用OpenSSL读取证书有效期信息。需要特别指出的是,OpenSSL对于SM2证书的"数据格式解析层"是完全支持的——证书的"有效期"、"颁发者"、"主题"等元数据以ASN.1编码格式存储在证书中,这一层的解析与使用何种签名算法无关。因此,即使OpenSSL环境中没有完整实现SM2算法,仍然可以正常读取证书的notAfter字段获取到期时间。
设置脚本权限:
bash
cd /usr/local/zabbix/share/zabbix/externalscripts/
chown zabbix:zabbix check_ssl.sh
chmod 755 check_ssl.sh
3.2 Zabbix配置步骤
创建监控项:进入Zabbix前端界面,创建新监控项,类型选择"外部检查",键值填写`check_ssl.sh[{$KEY}]`,信息类型选择"数字(无正负)",单位为"天",更新间隔设置为1天。
创建触发器:配置当证书剩余天数低于阈值时触发告警。例如,设置为剩余不足7天时发出警告。表达式中使用变量宏{$DAY},方便为不同域名设置不同的告警阈值。
创建模板:将上述监控项和触发器保存为模板,便于批量应用到多个监控对象。
配置告警媒介:可通过邮件、短信、钉钉等渠道发送告警通知。钉钉和企业微信需要在告警媒介配置中对接相应的Webhook接口。
四、轻量级脚本监控方案
4.1 企业微信机器人告警脚本
以下是一个完整的证书过期监控脚本示例,支持批量域名监控和企业微信推送告警:
bash
#!/bin/bash
# 域名列表文件,每行一个域名
DOMAINS_FILE="/etc/ssl-monitor/domains.txt"
# 告警阈值(剩余天数小于此值触发告警)
ALERT_DAYS=30
# 企业微信机器人 Webhook 地址
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY"
while IFS= read -r domain; do
[[ -z "$domain" || "$domain" =~ ^# ]] && continue
# 获取证书到期时间
cert_end_time=$(echo | openssl s_client -servername ${domain} -connect ${domain}:443 2>/dev/null | openssl x509 -noout -dates | grep 'After' | awk -F '=' '{print $2}' | awk '{print $1,$2,$4}')
# 转换为时间戳计算剩余天数
cert_timestamp=$(date +%s -d "$cert_end_time")
current_timestamp=$(date +%s)
remain_days=$(( (cert_timestamp - current_timestamp) / 86400 ))
# 判断是否需要告警
if [ $remain_days -lt $ALERT_DAYS ]; then
msg="$domain 证书还有 ${remain_days} 天后到期,请及时更新"
# 发送企业微信告警
curl "${WEBHOOK_URL}" -H 'Content-Type: application/json' -d '{
"msgtype": "text",
"text": { "content": "'"$msg"'" }
}' &> /dev/null
echo "$(date): WARNING - $msg"
else
echo "$(date): OK - $domain 证书有效期 ${remain_days} 天"
fi
done < "$DOMAINS_FILE"
4.2 配置cron定时任务
将脚本添加到crontab中,建议每日执行一次:
bash
# 编辑crontab
crontab -e
# 添加定时任务(每天凌晨2点执行)
0 2 * * * /bin/bash /usr/local/bin/ssl-monitor.sh
4.3 Linux系统高级监控方案(systemd Timer + Webhook)
对于Linux系统,可以结合systemd Timer实现更可靠的周期性执行,同时支持通用的Webhook告警,可对接Slack、Discord、钉钉等支持Webhook的平台:
核心检查逻辑:使用OpenSSL的`-checkend`参数直接判断证书是否在指定天数内过期,返回非零退出码表示证书即将过期,适合脚本判断。
完整脚本示例:创建`/usr/local/bin/tls-expiry-check.sh`,设置`WARN_DAYS=21`作为告警阈值,当证书剩余有效期不足21天时,通过curl向Webhook发送告警消息。脚本支持从`/etc/tls-monitor/domains.txt`读取域名列表,循环检查每个域名。
配置systemd服务:创建service文件和timer文件,确保脚本定时可靠执行。
日志查看:使用`journalctl -u tls-expiry-check`查看脚本执行日志。
五、Prometheus监控方案
5.1 x509-certificate-exporter部署
x509-certificate-exporter是一个专为Prometheus设计的X.509证书过期监控工具,由Go语言编写,支持监控多种证书来源:
PEM编码文件:通过路径扫描或直接指定目录中的证书文件
Kubeconfig文件:提取嵌入式证书
Kubernetes TLS Secret:监控集群中的TLS类型Secret
核心监控指标包括:
`x509_cert_not_before`:证书生效时间
`x509_cert_not_after`:证书过期时间
`x509_cert_expired`:证书是否已过期
`x509_cert_expires_in_seconds`:证书剩余有效期(秒)
部署方式:可直接使用二进制文件运行,也可使用Docker镜像(enix/x509-certificate-exporter)部署,在Kubernetes环境中推荐使用Helm Chart进行安装。
5.2 Prometheus告警规则配置
在Prometheus中配置如下告警规则,当证书剩余有效期不足阈值时自动触发告警:
yaml
groups:
- name: certificate_expiry.rules
rules:
- alert: CertificateRenewal
expr: ((x509_cert_not_after - time()) / 86400) < 28
for: 15m
labels:
severity: warning
annotations:
summary: "证书需要续期"
description: "证书 {{ $labels.subject_CN }} 剩余有效期不足28天"
- alert: CertificateExpiration
expr: ((x509_cert_not_after - time()) / 86400) < 14
for: 15m
labels:
severity: critical
annotations:
summary: "证书即将过期"
description: "证书 {{ $labels.subject_CN }} 剩余有效期不足14天"
建议28天(剩余不足一个月)触发警告级别告警,14天触发严重级别告警。配合官方提供的Grafana仪表盘(Dashboard ID: 13922)可实现可视化监控面板。
六、告警通知渠道配置
国密证书过期告警可通过多种渠道通知运维人员:
企业微信:在群中添加机器人获取Webhook地址,通过curl发送JSON格式的告警消息。
钉钉:同样支持通过自定义机器人Webhook接收告警通知。云服务商如阿里云PCA服务也原生支持钉钉消息提醒配置。
邮件:可通过配置SMTP服务发送邮件告警。Zabbix支持邮件告警媒介配置。
多级通知策略:建议采用分级通知策略——距离到期时间较远时(如60天)通过低优先级渠道通知;临近到期(如7天)通过高优先级渠道(如电话、钉钉紧急通知)告警。
七、最佳实践建议
设置合理的告警阈值:建议设置多级阈值——60天(提醒)、30天(警告)、14天(严重)、7天(紧急)。由于OV/EV型国密证书审核需预留1-5个工作日,且部分云平台要求手动续订,建议在到期前30-90天即开始续订流程,避免因审核周期导致证书空窗期。
利用云平台原生能力:各云平台提供的事件监控功能(如华为云VPNCertificatePreExpire系列事件)可实现即开即用的国密证书到期告警,无需额外开发。
定期审查监控配置:随着证书有效期逐年缩短(2026年起逐步推行更短有效期),应定期检查监控阈值和告警规则的有效性。建议制定密钥管理操作规程,包括密码人员管理、密钥管理、应急处置等制度。
综合管理平台:对于证书数量较多的企业,可考虑部署证书智能管理平台。天威诚信CIM证书智能管理平台能够自动识别并监控企业内外网中所有SSL证书服务,支持IP段扫描,支持自动发现证书资产、智能监控状态、自动化验证签发、批量部署同步等核心功能。