Project Icon

ssl_exporter

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

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

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

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

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号