首页 > 常见问题 > SSL证书部署监控:Prometheus+Grafana可视化证书状态

SSL证书部署监控:Prometheus+Grafana可视化证书状态

基于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-exporter

2. 组件验证与指标检查

(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: true

2. 常见告警渠道配置

  • 邮件告警:配置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机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!


最新修订日期:2026-03-17 12:31:26
为什么选择我们
  • 官方授权
    中国区合作伙伴
  • 证书远程协助
    安装服务
  • 无法安装
    30天退款保障
  • 免费提供
    28天试用证书

Copyrights © 2005 - 2025 https://cwssl.com/ 版权所有   

Telegram技术支持 技术支持 Telegram客服咨询 客服咨询