{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书基于Prometheus+Grafana的监控方案,可实现SSL证书状态的自动化采集、实时监控、阈值告警与可视化展示,覆盖证书有效期、签名算法、密钥长度等关键指标,为运维人员提供全面的证书生命周期管理工具。本文将从技术原理、部署流程、配置优化到可视化设计,详细介绍该方案的实现细节。
SSL证书监控方案的核心架构由“数据采集→存储分析→可视化告警”三层组成,各组件协同工作实现全链路监控:
graph LR
A[目标服务(Web/API/数据库)] --> B[证书采集器]
B --> C[Prometheus(存储+查询)]
C --> D[Grafana(可视化)]
C --> E[Alertmanager(告警)]
B ---->|配置文件| C(1)Prometheus
(2)证书采集器
主流采集器对比与选型建议:
| 采集器 | 核心功能 | 优势 | 适用场景 |
|---|---|---|---|
| blackbox_exporter | 支持HTTP/HTTPS/TCP等协议探测,内置证书检查 | 部署简单、支持多协议复用、无需额外配置 | 通用场景(Web服务、API网关) |
| ssl_exporter | 专注SSL证书指标采集,支持详细证书信息解析 | 指标维度丰富(有效期、算法、SAN等) | 复杂证书环境(多域名、wildcard证书) |
| custom_exporter | 自定义脚本(Python/Shell)采集证书信息 | 高度灵活,可适配特殊部署场景 | 非标准端口、私有协议服务 |
本文以ssl_exporter为例(指标更全面),结合blackbox_exporter实现互补采集。
(3)Grafana
(4)Alertmanager
(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)。
采用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(1)验证Prometheus采集状态
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)。
(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」即为成功。
(1)导入现成仪表盘(推荐)
Grafana官网提供成熟的SSL证书监控仪表盘模板,可直接导入:
(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分组,显示各域名的握手成功率变化趋势。
若需多渠道告警,需单独部署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基于Prometheus+Grafana的SSL证书监控方案,通过自动化采集、实时可视化与多渠道告警,彻底解决了传统人工巡检的效率低、易遗漏问题,实现了证书全生命周期的精细化管理。该方案具有部署灵活、配置简单、扩展性强等优势,可适配从小型企业到大型集团的各类SSL证书监控场景。
Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!