从各种来源收集并导出证书指标:
这些指标都标有证书中的字段,便于创建信息仪表盘和灵活的告警路由。
make
./ssl_exporter <参数>
与 blackbox_exporter 类似,访问 http://localhost:9219/probe?target=example.com:443 将返回 example.com 的证书指标。ssl_probe_success 指标表示探测是否成功。
docker run -p 9219:9219 ribbybibby/ssl-exporter:latest <参数>
用法: 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, ou | tcp, https |
| ssl_cert_not_before | 对等证书生效的日期。以 Unix 时间戳表示。 | serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | tcp, https |
| ssl_file_cert_not_after | 文件探测器找到的证书过期日期。以 Unix 时间戳表示。 | file, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | file |
| ssl_file_cert_not_before | 文件探测器找到的证书生效日期。以 Unix 时间戳表示。 | file, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | file |
| ssl_kubernetes_cert_not_after | Kubernetes 探测器找到的证书过期日期。以 Unix 时间戳表示。 | namespace, secret, key, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | kubernetes |
| ssl_kubernetes_cert_not_before | Kubernetes 探测器找到的证书生效日期。以 Unix 时间戳表示。 | namespace, secret, key, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | kubernetes |
| ssl_kubeconfig_cert_not_after | kubeconfig 探测器找到的证书过期日期。以 Unix 时间戳表示。 | kubeconfig, name, type, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | kubeconfig |
| ssl_kubeconfig_cert_not_before | kubeconfig 探测器找到的证书生效日期。以 Unix 时间戳表示。 | kubeconfig, name, type, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | kubeconfig |
| ssl_ocsp_response_next_update | OCSP 响应中的 nextUpdate 值。以 Unix 时间戳表示 | tcp, https | |
| ssl_ocsp_response_produced_at | OCSP 响应中 的 producedAt 值。以 Unix 时间戳表示 | tcp, https | |
| ssl_ocsp_response_revoked_at | OCSP 响应中的 revocationTime 值。以 Unix 时间戳表示 | tcp, https | |
| ssl_ocsp_response_status | OCSP 响应中的状态。0=正常 1=已吊销 2=未知 | tcp, https | |
| ssl_ocsp_response_stapled | 连接状态是否包含附加的 OCSP 响应? 布尔值。 | tcp, https | |
| ssl_ocsp_response_this_update | OCSP 响应中的 thisUpdate 值。以 Unix 时间戳表示 | tcp, https | |
| ssl_probe_success | 探测是否成功? 布尔值。 | 全部 | |
| ssl_prober | 导出器用于连接目标的探测器。布尔值。 | prober | 全部 |
| ssl_tls_version_info | 使用的 TLS 版本。始终为 1。 | version | tcp, https |
| ssl_verified_cert_not_after | 已验证链中证书的过期日期。以 Unix 时间戳表示。 | chain_no, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | tcp, https |
| ssl_verified_cert_not_before | 已验证链中证书的生效日期。以 Unix 时间戳表示。 | chain_no, serial_no, issuer_cn, cn, dnsnames, ips, emails, ou | tcp, https |
就像 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 导出器。
默认情况下,导出器将与目标建立 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_PROXY、HTTPS_PROXY 和 ALL_PROXY 发现的代理服务器。或者,你可以在模块配置中设置 https.proxy_url 选项。
后者优先级更高。
file 探测器为本地文件中找到的 PEM 编码证书导出 ssl_file_cert_not_after 和 ssl_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_file 探测器为指定 URL 中找到的 PEM 编码证书导出 ssl_cert_not_after 和 ssl_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_PROXY、HTTPS_PROXY 和 ALL_PROXY 中发现的代理服 务器。或者,你可以在模块配置中设置 http_file.proxy_url 选项。
后者优先级更高。
kubernetes 探测器为类型为 kubernetes.io/tls 的密钥中找到的 PEM 编码证书导出 ssl_kubernetes_cert_not_after 和 ssl_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)- 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 文件中找到的 PEM 编码证书导出 ssl_kubeconfig_cert_not_after 和 ssl_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>]
# 探测类型(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> ]
# 禁用目标证书验证。
[ 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> ]
# 用于连接目标的 HTTP 代理服务器。
[ proxy_url: <string> ]
# 在启动 TLS 之前使用 STARTTLS 命令(适用于支持的协议:smtp、ftp、imap、pop3、postgres)
[ starttls: <string> ]
# 用于配置探测的 kubeconfig 文件路径
[ kubeconfig: <string> ]
# 用于连接目标的 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
对等证书和客户端构建的验证链的 NotAfter 和 NotBefore 字段都会导出指标。
前者仅包括目标明确提供的证书,而后者可能包含多个由客户端持有的根证书到目标服务器证书构建的信任链。
这在监控证书过期时有重要影响。
例如,ssl_cert_not_after 可能报告目标提供的根证书即将过期,即使客户端可以使用本地持有的另一个有效根证书形成另一个更长寿命的信任链。在这种情况下,你可能想使用 ssl_verified_cert_not_after 来警告过期,因为这将包含客户端实际构建的链:
ssl_verified_cert_not_after{chain_no="0"} - time() < 86400 * 7
导出器按过期时间的相反顺序为每个链编号,因此 chain_no="0" 是最晚过期的链。因此,上面的查询只会在导出器和目标之间的信任链真正接近过期时发出警报。
非常重要的是要注意,这种查询仅代表导出器和目标之间的信任链。真正的客户端可能持有不同于导出器的根证书,因此可能有不同的验证信任链。
你可以在这里找到一个简单的仪表板,用于跟踪证书过期日期和目标连接错误。


最适合小白的AI自动化工作流平台
无需编码,轻松生成可复用、可变现的AI自动化工作流

大模型驱动的Excel数据处理工具
基于大模型交互的表格处理系统,允许用户通过对话方式完成数据整理和可视化分析。系统采用机器学习算法解析用户指令,自动执行排序、公式计算和数据透视等操作,支持多种文件格式导入导出。数据处理响应速度保持在0.8秒以内,支持超过100万行数据的即时分析。


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


AI论文写作指导平台
AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务 ,保障数据安全,有效提升写作效率和论文质量。


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


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

微信扫一扫关注公众号