Email:2225994292@qq.com
CNY
SSL证书部署监控:Prometheus+Grafana可视化证书状态
更新时间:2026-01-19 作者:SSL证书部署

基于Prometheus+Grafana的监控方案,可实现SSL证书状态的自动化采集、实时监控、阈值告警与可视化展示,覆盖证书有效期、签名算法、密钥长度等关键指标,为运维人员提供全面的证书生命周期管理工具。本文将从技术原理、部署流程、配置优化到可视化设计,详细介绍该方案的实现细节。

一、技术架构与核心组件

1. 整体架构设计

SSL证书监控方案的核心架构由“数据采集→存储分析→可视化告警”三层组成,各组件协同工作实现全链路监控:

graph LR
    A[目标服务(Web/API/数据库)] --> B[证书采集器]
    B --> C[Prometheus(存储+查询)]
    C --> D[Grafana(可视化)]
    C --> E[Alertmanager(告警)]
    B ---->|配置文件| C
  • 数据采集层:通过专用采集器(如blackbox_exporterssl_exporter)获取目标服务的SSL证书信息,转换为Prometheus可识别的指标格式;
  • 存储分析层:Prometheus负责指标存储、时序数据处理与查询计算,支持自定义监控规则;
  • 可视化告警层:Grafana提供丰富的仪表盘展示,Alertmanager基于预设阈值触发告警(邮件、钉钉、Slack等渠道)。

2. 核心组件说明

(1)Prometheus

  • 核心功能:时序数据存储、指标采集(Pull模式)、PromQL查询语言支持、监控规则配置;
  • 适配优势:支持多维度标签(如instancedomainport),可按服务、域名分类监控证书,原生支持告警规则配置。

(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=Admin@123  # 初始密码,生产环境需修改
    restart: always
    depends_on:
      - prometheus

volumes:
  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 prometheus
docker-compose logs -f ssl-exporter

2. 组件验证与指标检查

(1)验证Prometheus采集状态

  • 访问http://{Prometheus服务器IP}:9090,进入Prometheus UI;
  • 点击「Status」→「Targets」,确认ssl-exporterblackbox-ssl任务的StateUP
  • 在「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_namessl_cert_issuer)。

四、Grafana可视化设计与配置

1. 配置Prometheus数据源

(1)访问http://{服务器IP}:3000,使用初始账号(admin/Admin@123)登录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: 'alert@example.com'
  smtp_smarthost: 'smtp.example.com:25'
  smtp_auth_username: 'alert@example.com'
  smtp_auth_password: 'SMTP密码'
  smtp_require_tls: false

route:
  group_by: ['alertname', 'instance']
  group_wait: 10s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'email-notify'

receivers:
- name: 'email-notify'
  email_configs:
  - to: 'ops@example.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过滤无用标签,仅保留domaininstance等关键信息;
  • 存储策略:配置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证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.173313s