基于Prometheus+Grafana的监控方案,可实现SSL证书状态的自动化采集、实时监控、阈值告警与可视化展示,覆盖证书有效期、签名算法、密钥长度等关键指标,为运维人员提供全面的证书生命周期管理工具。本文将从技术原理、部署流程、配置优化到可视化设计,详细介绍该方案的实现细节。
一、技术架构与核心组件
1. 整体架构设计
SSL证书监控方案的核心架构由“数据采集→存储分析→可视化告警”三层组成,各组件协同工作实现全链路监控:
graph LR A[目标服务(Web/API/数据库)] --> B[证书采集器] B --> C[Prometheus(存储+查询)] C --> D[Grafana(可视化)] C --> E[Alertmanager(告警)] B ---->|配置文件| C- 数据采集层:通过专用采集器(如blackbox_exporter、ssl_exporter)获取目标服务的SSL证书信息,转换为Prometheus可识别的指标格式;
- 存储分析层:Prometheus负责指标存储、时序数据处理与查询计算,支持自定义监控规则;
- 可视化告警层:Grafana提供丰富的仪表盘展示,Alertmanager基于预设阈值触发告警(邮件、钉钉、Slack等渠道)。
2. 核心组件说明
(1)Prometheus
- 核心功能:时序数据存储、指标采集(Pull模式)、PromQL查询语言支持、监控规则配置;
- 适配优势:支持多维度标签(如instance、domain、port),可按服务、域名分类监控证书,原生支持告警规则配置。
(2)证书采集器
主流采集器对比与选型建议:
| 采集器 | 核心功能 | 优势 | 适用场景 |
|---|---|---|---|
| blackbox_exporter | 支持HTTP/HTTPS/TCP等协议探测,内置证书检查 | 部署简单、支持多协议复用、无需额外配置 | 通用场景(Web服务、API网关) |
| ssl_exporter | 专注SSL证书指标采集,支持详细证书信息解析 | 指标维度丰富(有效期、算法、SAN等) | 复杂证书环境(多域名、wildcard证书) |
| custom_exporter | 自定义脚本(Python/Shell)采集证书信息 | 高度灵活,可适配特殊部署场景 | 非标准端口、私有协议服务 |
本文以ssl_exporter为例(指标更全面),结合blackbox_exporter实现互补采集。
(3)Grafana
- 核心价值:提供拖拽式仪表盘设计、多数据源支持、丰富的可视化组件(图表、仪表盘、告警面板);
- 适配优势:内置Prometheus数据源插件,支持按证书域名、过期天数、服务类型等维度聚合展示。
(4)Alertmanager
- 核心功能:告警规则匹配、分组、路由与静默管理,支持多渠道通知;
- 关键作用:当证书有效期低于阈值(如30天)或配置异常时,及时触发告警,避免证书过期导致服务中断。
二、部署前准备与环境要求
1. 环境依赖
(1)操作系统:Linux(CentOS 7+/Ubuntu 18.04+)、Docker(推荐容器化部署);
(2)硬件配置:最低2核4G(生产环境建议4核8G,支持时序数据存储扩展);
(3)网络要求:
1)Prometheus需能访问目标服务的443端口(或自定义SSL端口);
2)采集器、Prometheus、Grafana之间网络互通(默认端口:Prometheus 9090、Grafana 3000、ssl_exporter 9219)。
2. 目标服务准备
- 确认需监控的SSL服务(如Web服务器Nginx/Apache、API网关、数据库MySQL 8.0+等);
- 记录目标服务的域名/IP、SSL端口(默认443,非标准端口需单独标注);
- 确保目标服务的SSL证书可被外部访问(无防火墙拦截)。
三、分步部署与配置实现
1. 容器化部署核心组件(推荐)
采用Docker Compose实现一键部署,简化环境配置与版本管理。
(1)创建Docker Compose文件
新建docker-compose.yml,包含Prometheus、Grafana、ssl_exporter、blackbox_exporter组件:
version: '3.8'services: # ssl_exporter:证书详细指标采集 ssl-exporter: image: ribbybibby/ssl-exporter:latest container_name: ssl-exporter ports: - "9219:9219" command: --config.file=/etc/ssl-exporter/config.yml volumes: - ./ssl-exporter/config.yml:/etc/ssl-exporter/config.yml restart: always # blackbox_exporter:HTTP/HTTPS协议探测与证书基础检查 blackbox-exporter: image: prom/blackbox-exporter:latest container_name: blackbox-exporter ports: - "9115:9115" volumes: - ./blackbox-exporter/config.yml:/etc/blackbox_exporter/config.yml restart: always # Prometheus:指标存储与查询 prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prometheus-data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' restart: always depends_on: - ssl-exporter - blackbox-exporter # Grafana:可视化仪表盘 grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" volumes: - grafana-data:/var/lib/grafana environment: - GF_SECURITY_ADMIN_PASSWORD=test@test.com # 初始密码,生产环境需修改 restart: always depends_on: - prometheusvolumes: prometheus-data: grafana-data:(2)配置ssl_exporter(证书详细采集)
新建./ssl-exporter/config.yml,定义监控目标与采集规则:
# 全局配置global: scrape_interval: 5m # 采集间隔,生产环境建议5-10分钟# 监控目标列表targets: - name: "生产环境Web服务" targets: - "www.example.com:443" # 主域名 - "api.example.com:443" # API服务 - "admin.example.com:8443" # 非标准端口服务 - name: "测试环境服务" targets: - "test.example.com:443"# 采集配置scrape_configs: - job_name: 'ssl-certificates' metrics_path: /probe params: module: [ssl_verify] # 启用证书验证模块 static_configs: - targets: - "www.example.com:443" - "api.example.com:443" - "admin.example.com:8443" - "test.example.com:443" relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance # 实例标签(显示为域名:端口) - target_label: __address__ replacement: ssl-exporter:9219 # 指向ssl-exporter服务(3)配置blackbox_exporter(协议探测)
新建./blackbox-exporter/config.yml,启用HTTPS探测模块:
modules: https_2xx: prober: http timeout: 5s http: method: GET tls_config: insecure_skip_verify: false # 启用证书验证 preferred_ip_protocol: "ip4" ssl_cert: prober: tcp timeout: 5s tcp: query_response: - expect: "^HTTP/1\\." tls: true # 启用TLS握手,获取证书信息(4)配置Prometheus(指标采集与规则)
新建./prometheus/prometheus.yml,添加采集任务与告警规则:
global: scrape_interval: 1m # 全局采集间隔 evaluation_interval: 1m # 规则评估间隔# 采集任务配置scrape_configs: # 采集ssl_exporter指标 - job_name: 'ssl-exporter' static_configs: - targets: ['ssl-exporter:9219'] # 采集blackbox_exporter探测结果 - job_name: 'blackbox-ssl' metrics_path: /probe params: module: [ssl_cert] # 使用ssl_cert模块 static_configs: - targets: - "www.example.com:443" - "api.example.com:443" relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115# 告警规则配置rule_files: - "alert_rules.yml"# Alertmanager配置(可选,需单独部署)alerting: alertmanagers: - static_configs: - targets: - 'alertmanager:9093'(5)配置告警规则(alert_rules.yml)
新建./prometheus/alert_rules.yml,定义证书相关告警阈值:
groups:- name: ssl_cert_alerts rules: # 证书有效期低于30天告警(P1级别) - alert: SSLCertExpiringSoon expr: ssl_cert_not_after - time() 24 * 3600 for: 5m labels: severity: critical annotations: summary: "SSL证书即将过期" description: "域名 { { $labels.instance }} 的SSL证书将在 { { $value | humanizeDuration }} 后过期,请及时更新。" # 证书有效期低于7天告警(P0级别,紧急) - alert: SSLCertExpiringImminent expr: ssl_cert_not_after - time() 7 * 24 * 3600 for: 1m labels: severity: emergency annotations: summary: "SSL证书紧急过期" description: "域名 { { $labels.instance }} 的SSL证书将在 { { $value | humanizeDuration }} 后过期,需立即处理!" # 证书配置错误(如签名算法不安全) - alert: SSLCertInvalidConfig expr: ssl_cert_signature_algorithm =~ "SHA1|MD5" for: 10m labels: severity: warning annotations: summary: "SSL证书配置不安全" description: "域名 { { $labels.instance }} 的证书使用不安全的签名算法 { { $labels.ssl_cert_signature_algorithm }},存在安全风险。" # 证书不可用(握手失败) - alert: SSLCertUnavailable expr: blackbox_probe_success == 0 for: 5m labels: severity: critical annotations: summary: "SSL证书不可用" description: "域名 { { $labels.instance }} 的SSL握手失败,可能是证书过期、配置错误或服务中断。"(6)启动服务
在docker-compose.yml所在目录执行命令:
# 启动所有组件docker-compose up -d# 查看启动状态docker-compose ps# 查看日志(排查问题)docker-compose logs -f prometheusdocker-compose logs -f ssl-exporter2. 组件验证与指标检查
(1)验证Prometheus采集状态
- 访问http://{ Prometheus服务器IP}:9090,进入Prometheus UI;
- 点击「Status」→「Targets」,确认ssl-exporter、blackbox-ssl任务的State为UP;
- 在「Graph」页面输入查询语句,验证指标是否正常采集:
1)证书过期时间:ssl_cert_not_after-time()(返回值为秒数);
2)证书签名算法:ssl_cert_signature_algorithm;
3)握手成功率:blackbox_probe_success(1为成功,0为失败)。
(2)验证ssl_exporter指标
访问http://{ 服务器IP}:9219/metrics,查看是否包含目标域名的证书指标(如ssl_cert_subject_common_name、ssl_cert_issuer)。
四、Grafana可视化设计与配置
1. 配置Prometheus数据源
(1)访问http://{ 服务器IP}:3000,使用初始账号(admin/test@test.com)登录Grafana;
(2)点击左侧「Configuration」→「Data sources」→「Add data source」;
(3)选择「Prometheus」,配置数据源信息:
1)Name:Prometheus-SSL-Monitor;
2)URL:http://prometheus:9090(Docker内部网络,直接使用容器名);
3)其他默认配置,点击「Save & test」,显示「Data source is working」即为成功。
2. 导入/创建SSL证书监控仪表盘
(1)导入现成仪表盘(推荐)
Grafana官网提供成熟的SSL证书监控仪表盘模板,可直接导入:
- 点击左侧「Dashboards」→「Import」;
- 输入模板ID:13978(SSL Certificate Monitoring)或14690(SSL/TLS Certificate Monitor);
- 选择已配置的Prometheus数据源,点击「Import」,即可生成完整仪表盘。
(2)自定义仪表盘设计(进阶)
若需适配业务场景,可自定义仪表盘,核心面板设计如下:
- 证书过期天数统计:
1)组件类型:Gauge(仪表盘)或Bar Chart(柱状图);
2)查询语句:ssl_cert_not_after-time();
3)格式化:将秒数转换为天数({ { $value / 86400 | printf "%.1f" }} 天);
4)阈值设置:绿色(>30天)、黄色(7-30天)、红色(
- 证书状态概览:
1)组件类型:Stat(状态卡片);
2)指标:
a. 正常证书数:count(ssl_cert_not_after-time()>30*86400);
b. 即将过期证书数:count(ssl_cert_not_after-time()*86400 and ssl_cert_not_after-time()>7*86400);
c. 已过期证书数:count(ssl_cert_not_after-time()0)。
- 证书配置详情表:
1)组件类型:Table(表格);
2)列配置:
a. 域名:instance(标签);
b. 证书主体:ssl_cert_subject_common_name;
c. 签发机构:ssl_cert_issuer_common_name;
d. 过期时间:ssl_cert_not_after(格式化时间戳);
e. 剩余天数:(ssl_cert_not_after-time())/86400(保留1位小数);
f. 签名算法:ssl_cert_signature_algorithm。
- 握手成功率趋势:
1)组件类型:Time Series(时序图);
2)查询语句:blackbox_probe_success;
3)分组:按instance分组,显示各域名的握手成功率变化趋势。
3. 仪表盘优化技巧
- 添加变量过滤:创建domain变量(关联instance标签),支持按域名筛选数据;
- 自动刷新:设置仪表盘自动刷新间隔(如5分钟),实时同步指标变化;
- 告警面板集成:在仪表盘添加「Alert List」组件,显示当前触发的证书告警。
五、告警配置与通知渠道
1. 部署Alertmanager(可选)
若需多渠道告警,需单独部署Alertmanager,配置文件alertmanager.yml:
global: smtp_from: 'test@test.com' smtp_smarthost: 'smtp.example.com:25' smtp_auth_username: 'test@test.com' smtp_auth_password: 'SMTP密码' smtp_require_tls: falseroute: group_by: ['alertname', 'instance'] group_wait: 10s group_interval: 5m repeat_interval: 1h receiver: 'email-notify'receivers:- name: 'email-notify' email_configs: - to: 'test@test.com' send_resolved: true # 发送告警恢复通知 webhook_configs: - url: 'https://oapi.dingtalk.com/robot/send?access_token=钉钉机器人Token' # 钉钉告警 send_resolved: true2. 常见告警渠道配置
- 邮件告警:配置SMTP服务器信息,支持抄送、回复通知;
- 钉钉/企业微信告警:通过Webhook接入机器人,支持@运维人员、加急标记;
- Slack告警:集成Slack Webhook,适合海外团队使用;
- PagerDuty告警:对接工单系统,实现告警闭环管理。
六、最佳实践与优化建议
1. 性能优化
- 调整采集间隔:非核心服务可将采集间隔延长至10-15分钟,减少Prometheus存储压力;
- 指标过滤:通过relabel_configs过滤无用标签,仅保留domain、instance等关键信息;
- 存储策略:配置Prometheus数据保留期(如--storage.tsdb.retention.time=30d),避免磁盘溢出。
2. 安全加固
- 修改默认密码:Grafana、Prometheus的默认账号密码需及时更换,避免未授权访问;
- 启用HTTPS:为Grafana、Prometheus配置SSL证书,加密Web访问;
- 网络隔离:限制Prometheus、Grafana的访问IP,仅允许运维网段访问。
3. 运维管理
- 定期备份:备份Prometheus数据、Grafana配置与仪表盘(导出JSON文件);
- 证书生命周期管理:结合监控数据,建立证书更新流程(如过期前30天发起申请、15天完成部署);
- 多环境适配:通过标签区分生产/测试/预发环境,避免告警混淆。
七、常见问题排查
1. 指标采集失败
- 检查目标服务端口是否开放:telnet{ 目标IP}443;
- 确认ssl_exporter配置文件中的目标地址格式正确(域名:端口);
- 查看ssl_exporter日志:docker-compose logs -f ssl-exporter,排查握手失败原因(如证书无效、协议不兼容)。
2. Grafana仪表盘无数据
- 验证Prometheus数据源配置是否正确(URL是否可达);
- 检查查询语句是否正确:在Prometheus UI中测试查询语句,确认有返回结果;
- 确认指标标签匹配:Grafana查询的标签(如instance)需与Prometheus中的标签一致。
3. 告警未触发
- 检查告警规则表达式是否正确:在Prometheus「Alerts」页面查看规则状态;
- 确认for字段配置:若配置for:5m,需指标满足条件5分钟后才会触发告警;
- 检查Alertmanager路由配置:确保告警被正确路由到指定接收者。
基于Prometheus+Grafana的SSL证书监控方案,通过自动化采集、实时可视化与多渠道告警,彻底解决了传统人工巡检的效率低、易遗漏问题,实现了证书全生命周期的精细化管理。该方案具有部署灵活、配置简单、扩展性强等优势,可适配从小型企业到大型集团的各类SSL证书监控场景。
Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
最新修订日期:2026-03-17 19:17:23