ssl_exporter

ssl_exporter

全面SSL证书监控与指标导出系统

ssl_exporter是一款全面的SSL证书监控系统,可从多个来源收集证书信息并导出指标。支持TCP、HTTPS探测,PEM文件读取,以及Kubernetes secrets和Kubeconfig文件分析。系统提供丰富的标签化指标,便于构建告警和仪表板。易于部署且支持Docker,灵活的配置选项使其适用于各种SSL证书监控需求。

SSL证书导出器监控PrometheusGithub开源项目

SSL 证书导出器

从各种来源收集并导出证书指标:

这些指标都标有证书中的字段,便于创建信息仪表盘和灵活的告警路由。

构建

make
./ssl_exporter <参数>

与 blackbox_exporter 类似,访问 http://localhost:9219/probe?target=example.com:443 将返回 example.com 的证书指标。ssl_probe_success 指标表示探测是否成功。

Docker

docker run -p 9219:9219 ribbybibby/ssl-exporter:latest <参数>

发布流程

  • 在 Github 中创建带有语义化版本标签的发布,GH actions 将:
    • 添加变更日志
    • 上传二进制文件
    • 构建并推送 Docker 镜像

用法

用法: ssl_exporter [<参数>]

参数:
  -h, --help                     显示上下文相关帮助(也可尝试 --help-long 和 --help-man)。
      --web.listen-address=":9219"  
                                 监听 web 界面和遥测数据的地址。
      --web.metrics-path="/metrics"
                                 暴露指标的路径
      --web.probe-path="/probe"  暴露探测端点的路径
      --config.file=""           SSL 导出器配置文件
      --log.level="info"         仅记录给定严重级别或更高级别的日志消息。有效级别: [debug, info, warn, error, fatal]
      --log.format="logger:stderr"
                                 设置日志目标和格式。示例:
                                 "logger:syslog?appname=bob&local=7" 或
                                 "logger:stdout?json=true"  
      --version                  显示应用版本。

指标

指标含义标签探测器
ssl_cert_not_after对等证书过期的日期。以 Unix 时间戳表示。serial_no, issuer_cn, cn, dnsnames, ips, emails, outcp, https
ssl_cert_not_before对等证书生效的日期。以 Unix 时间戳表示。serial_no, issuer_cn, cn, dnsnames, ips, emails, outcp, https
ssl_file_cert_not_after文件探测器找到的证书过期日期。以 Unix 时间戳表示。file, serial_no, issuer_cn, cn, dnsnames, ips, emails, oufile
ssl_file_cert_not_before文件探测器找到的证书生效日期。以 Unix 时间戳表示。file, serial_no, issuer_cn, cn, dnsnames, ips, emails, oufile
ssl_kubernetes_cert_not_afterKubernetes 探测器找到的证书过期日期。以 Unix 时间戳表示。namespace, secret, key, serial_no, issuer_cn, cn, dnsnames, ips, emails, oukubernetes
ssl_kubernetes_cert_not_beforeKubernetes 探测器找到的证书生效日期。以 Unix 时间戳表示。namespace, secret, key, serial_no, issuer_cn, cn, dnsnames, ips, emails, oukubernetes
ssl_kubeconfig_cert_not_afterkubeconfig 探测器找到的证书过期日期。以 Unix 时间戳表示。kubeconfig, name, type, serial_no, issuer_cn, cn, dnsnames, ips, emails, oukubeconfig
ssl_kubeconfig_cert_not_beforekubeconfig 探测器找到的证书生效日期。以 Unix 时间戳表示。kubeconfig, name, type, serial_no, issuer_cn, cn, dnsnames, ips, emails, oukubeconfig
ssl_ocsp_response_next_updateOCSP 响应中的 nextUpdate 值。以 Unix 时间戳表示tcp, https
ssl_ocsp_response_produced_atOCSP 响应中的 producedAt 值。以 Unix 时间戳表示tcp, https
ssl_ocsp_response_revoked_atOCSP 响应中的 revocationTime 值。以 Unix 时间戳表示tcp, https
ssl_ocsp_response_statusOCSP 响应中的状态。0=正常 1=已吊销 2=未知tcp, https
ssl_ocsp_response_stapled连接状态是否包含附加的 OCSP 响应? 布尔值。tcp, https
ssl_ocsp_response_this_updateOCSP 响应中的 thisUpdate 值。以 Unix 时间戳表示tcp, https
ssl_probe_success探测是否成功? 布尔值。全部
ssl_prober导出器用于连接目标的探测器。布尔值。prober全部
ssl_tls_version_info使用的 TLS 版本。始终为 1。versiontcp, https
ssl_verified_cert_not_after已验证链中证书的过期日期。以 Unix 时间戳表示。chain_no, serial_no, issuer_cn, cn, dnsnames, ips, emails, outcp, https
ssl_verified_cert_not_before已验证链中证书的生效日期。以 Unix 时间戳表示。chain_no, serial_no, issuer_cn, cn, dnsnames, ips, emails, outcp, https

配置

TCP

就像 blackbox_exporter 一样,你应该在刮取配置中通过巧妙的重新标记将目标传递给导出器的单个实例。这允许你利用服务发现并将配置集中在 Prometheus 配置中。

scrape_configs: - job_name: "ssl" metrics_path: /probe static_configs: - targets: - example.com:443 - prometheus.io:443 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 127.0.0.1:9219 # SSL 导出器。

HTTPS

默认情况下,导出器将与目标建立 TCP 连接。这适用于大多数情况,但如果你想利用 http 代理,可以通过设置 https 模块参数来使用 HTTPS 客户端:

scrape_configs: - job_name: "ssl" metrics_path: /probe params: module: ["https"] # <----- static_configs: - targets: - example.com:443 - prometheus.io:443 relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 127.0.0.1:9219

这将使用环境变量 HTTP_PROXYHTTPS_PROXYALL_PROXY 发现的代理服务器。或者,你可以在模块配置中设置 https.proxy_url 选项。

后者优先级更高。

文件

file 探测器为本地文件中找到的 PEM 编码证书导出 ssl_file_cert_not_afterssl_file_cert_not_before

可以通过提供目标参数来刮取导出器本地的文件:

curl "localhost:9219/probe?module=file&target=/etc/ssl/cert.pem"

目标参数支持通配(由 doublestar 包提供),允许你一次捕获多个文件:

curl "localhost:9219/probe?module=file&target=/etc/ssl/**/*.pem"

此探测器的一个特定用途可以是在 Kubernetes 中将导出器作为 DaemonSet 运行,然后刮取每个实例以检查每个节点上证书的过期时间:

scrape_configs: - job_name: "ssl-kubernetes-file" metrics_path: /probe params: module: ["file"] target: ["/etc/kubernetes/**/*.crt"] kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: ^(.*):(.*)$ target_label: __address__ replacement: ${1}:9219

HTTP 文件

http_file 探测器为指定 URL 中找到的 PEM 编码证书导出 ssl_cert_not_afterssl_cert_not_before

curl "localhost:9219/probe?module=http_file&target=https://www.paypalobjects.com/marketing/web/logos/paypal_com.pem"

这是一个示例 Prometheus 配置:

scrape_configs: - job_name: 'ssl-http-files' metrics_path: /probe params: module: ["http_file"] static_configs: - targets: - 'https://www.paypalobjects.com/marketing/web/logos/paypal_com.pem' - 'https://d3frv9g52qce38.cloudfront.net/amazondefault/amazon_web_services_inc_2024.pem' relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: 127.0.0.1:9219

对于代理到目标资源,此探测器将使用在环境变量 HTTP_PROXYHTTPS_PROXYALL_PROXY 中发现的代理服务器。或者,你可以在模块配置中设置 http_file.proxy_url 选项。

后者优先级更高。

Kubernetes

kubernetes 探测器为类型为 kubernetes.io/tls 的密钥中找到的 PEM 编码证书导出 ssl_kubernetes_cert_not_afterssl_kubernetes_cert_not_before

<命名空间>/<名称> 的形式提供密钥的命名空间和名称作为目标:

curl "localhost:9219/probe?module=kubernetes&target=kube-system/secret-name"

目标的命名空间和名称部分都支持通配符匹配(由 doublestar 包提供):

curl "localhost:9219/probe?module=kubernetes&target=kube-system/*"

curl "localhost:9219/probe?module=kubernetes&target=*/*"

导出器按以下顺序从以下来源检索凭证和上下文配置:

  • 模块配置中的 kubeconfig 路径
  • $KUBECONFIG 环境变量
  • 默认配置文件 ($HOME/.kube/config)
  • 如果在 pod 中运行,则为集群内环境
- job_name: "ssl-kubernetes" metrics_path: /probe params: module: ["kubernetes"] static_configs: - targets: - "test-namespace/nginx-cert" relabel_configs: - source_labels: [ __address__ ] target_label: __param_target - source_labels: [ __param_target ] target_label: instance - target_label: __address__ replacement: 127.0.0.1:9219

Kubeconfig

kubeconfig 探测器为指定 kubeconfig 文件中找到的 PEM 编码证书导出 ssl_kubeconfig_cert_not_afterssl_kubeconfig_cert_not_before

可以通过提供目标参数来刮取导出器本地的 kubeconfig:

curl "localhost:9219/probe?module=kubeconfig&target=/etc/kubernetes/admin.conf"

此探测器的一个特定用途可以是在 Kubernetes 中将导出器作为 DaemonSet 运行,然后刮取每个实例以检查每个节点上证书的过期时间:

scrape_configs: - job_name: "ssl-kubernetes-kubeconfig" metrics_path: /probe params: module: ["kubeconfig"] target: ["/etc/kubernetes/admin.conf"] kubernetes_sd_configs: - role: node relabel_configs: - source_labels: [__address__] regex: ^(.*):(.*)$ target_label: __address__ replacement: ${1}:9219

配置文件

你可以通过提供配置文件的路径来进行进一步的模块配置,使用 --config.file 参数。该文件以 yaml 格式编写,由以下模式定义。

# 默认使用的模块。如果省略,则必须通过 'module' 查询参数提供模块
default_module: <string>

# 模块配置
modules: [<module>]

<module>

# 探测类型(https、tcp、file、kubernetes、kubeconfig)
prober: <prober_string>

# 探测目标。如果设置,则忽略 'target' 查询参数。
# 如果省略,则需要 'target' 查询参数。
target: <string>

# 探测等待超时时间。
[ timeout: <duration> ]

# TLS 配置
[ tls_config: <tls_config> ]

# 特定探测配置
[ https: <https_probe> ]
[ tcp: <tcp_probe> ]
[ kubernetes: <kubernetes_probe> ]
[ http_file: <http_file_probe> ]

<tls_config>

# 禁用目标证书验证。
[ insecure_skip_verify: <boolean> | default = false ]

# 配置 TLS 重新协商支持。
# 有效选项:never、once、freely
[ renegotiation: <string> | default = never ]

# 用于目标的 CA 证书。
[ ca_file: <filename> ]

# 用于目标的客户端证书文件。
[ cert_file: <filename> ]

# 用于目标的客户端密钥文件。
[ key_file: <filename> ]

# 用于验证目标主机名。
[ server_name: <string> ]

<https_probe>

# 用于连接目标的 HTTP 代理服务器。
[ proxy_url: <string> ]

<tcp_probe>

# 在启动 TLS 之前使用 STARTTLS 命令(适用于支持的协议:smtp、ftp、imap、pop3、postgres)
[ starttls: <string> ]

<kubernetes_probe>

# 用于配置探测的 kubeconfig 文件路径
[ kubeconfig: <string> ]

<http_file_probe>

# 用于连接目标的 HTTP 代理服务器。
[ proxy_url: <string> ]

示例查询

7 天内过期的证书:

ssl_cert_not_after - time() < 86400 * 7

即将过期的通配符证书:

ssl_cert_not_after{cn=~"\*.*"} - time() < 86400 * 7

在验证链中 7 天内过期且最晚过期的证书:

ssl_verified_cert_not_after{chain_no="0"} - time() < 86400 * 7

服务器提供的证书数量:

count(ssl_cert_not_after) by (instance)

识别失败的探测:

ssl_probe_success == 0

对等证书 vs 验证链证书

对等证书和客户端构建的验证链的 NotAfterNotBefore 字段都会导出指标。

前者仅包括目标明确提供的证书,而后者可能包含多个由客户端持有的根证书到目标服务器证书构建的信任链。

这在监控证书过期时有重要影响。

例如,ssl_cert_not_after 可能报告目标提供的根证书即将过期,即使客户端可以使用本地持有的另一个有效根证书形成另一个更长寿命的信任链。在这种情况下,你可能想使用 ssl_verified_cert_not_after 来警告过期,因为这将包含客户端实际构建的链:

ssl_verified_cert_not_after{chain_no="0"} - time() < 86400 * 7

导出器按过期时间的相反顺序为每个链编号,因此 chain_no="0" 是最晚过期的链。因此,上面的查询只会在导出器和目标之间的信任链真正接近过期时发出警报。

非常重要的是要注意,这种查询仅代表导出器和目标之间的信任链。真正的客户端可能持有不同于导出器的根证书,因此可能有不同的验证信任链。

Grafana

你可以在这里找到一个简单的仪表板,用于跟踪证书过期日期和目标连接错误。

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多