ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Envoy TLS/SSL 统计指标全解:从握手、证书验证到 OCSP 的全景监控指南

2026/9/12 17:22:06 拓冰建站 浏览量
Envoy TLS/SSL 统计指标全解:从握手、证书验证到 OCSP 的全景监控指南 Envoy TLS/SSL 统计指标全解从握手、证书验证到 OCSP 的全景监控指南【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoyEnvoy 在 TLS 传输层为每一次握手、证书校验与 OCSP 装订决策埋设了精细的统计指标帮助运维人员在不解密流量的情况下洞察加密链路的健康度。本文以 docs/root/_include/ssl_stats.rst 定义的 20 个 TLS 计数器为骨架结合 source/common/tls/stats.h 等源码实现逐一讲解每个指标的含义、触发时机与监控用途让你能够基于这些指标快速定位 TLS 握手失败、客户端证书缺失、证书链校验失败与 OCSP 策略违例等真实问题。TLS 统计的挂载位置与命名空间ssl_stats.rst是一份被复用的统计清单在 Envoy 文档中被两处引用分别对应两个不同的统计命名空间下行方向Listener 侧在 docs/root/configuration/listeners/stats.rst 中TLS 统计挂载在listener.address.ssl.*当配置了stat_prefix时为listener.stat_prefix.ssl.*之下。这里的address是监听地址例如listener.0.0.0.0_443.ssl.handshake。上行方向Cluster 侧在 docs/root/configuration/upstream/cluster_manager/cluster_stats.rst 中当集群启用了 TLS 时统计挂载在cluster.name.ssl.*之下例如cluster.service_https.ssl.connection_error。也就是说同样的 20 个指标会在 Envoy 同时以listener.*.ssl.*与cluster.*.ssl.*两个前缀出现分别刻画「接收方」与「发起方」两个视角的 TLS 链路质量。监控时需要区分二者Listener 侧反映下游客户端连入的加密体验Cluster 侧反映 Envoy 作为客户端访问上游时的加密健康度。从源码看这些计数器全部由 source/common/tls/stats.h 中的ALL_SSL_STATS宏集中声明类型统一为Counter单调递增计数结构体SslStats通过generateSslStats(Stats::Scope store)在各自作用域下实例化。这意味着指标按作用域隔离同一个 Envoy 实例中每个 Listener 和每个 Cluster 各自拥有独立的计数实例。握手与会话生命周期指标这类指标回答TLS 连接最终成功与否、以及复用了多少次会话是链路健康度最直接的晴雨表。指标名类型含义connection_errorCounter发生 TLS 连接错误的连接总数不含证书校验失败的情况handshakeCounter成功完成 TLS 握手的连接总数session_reusedCounter成功复用 TLS 会话的连接总数connection_error是所有 TLS 层错误的总入口计数器但明确排除了因证书验证失败导致的情况后者由fail_verify_*系列指标单独统计。在 source/common/tls/context_impl.cc 中可以看到握手失败路径会调用stats_.fail_verify_error_.inc()或进入错误分支而真正的传输层错误、协议错误等则归入connection_error。当该指标快速上涨且伴随fail_verify_*无明显增长时应优先排查 TLS 版本不匹配、协议不兼容或网络中断类问题。handshake统计成功完成的握手次数在 context_impl.cc 中于握手校验通过后调用stats_.handshake_.inc()。它代表有效的加密连接建立数是计算握手成功率handshake / (handshake 各类失败))的分子。session_reused统计通过 TLS 会话恢复session resumption成功建连的次数context_impl.cc 中在握手完成且判定为会话复用后调用stats_.session_reused_.inc()。会话复用省去了完整的密钥协商过程能显著降低连接建立延迟。session_reused / handshake可用来评估会话复用效率比例过低说明客户端多为短连接且未开启复用或服务端会话缓存配置不合理。客户端证书与证书链验证指标这类指标直接对应 mTLS双向 TLS场景帮助判断证书层面为什么拒绝连接。指标名类型含义no_certificateCounter未携带客户端证书但成功建立的 TLS 连接总数fail_verify_no_certCounter因缺少客户端证书而失败的 TLS 连接总数fail_verify_errorCounter因 CA 校验失败而失败的 TLS 连接总数fail_verify_sanCounter因 SANSubject Alternative Name校验失败而失败的 TLS 连接总数fail_verify_cert_hashCounter因证书固定certificate pinning校验失败而失败的 TLS 连接总数no_certificate与fail_verify_no_cert是是否需要客户端证书这一策略的一体两面当服务端配置了require_client_certificate时未携带证书的客户端会被拒绝计数落入fail_verify_no_cert而当服务端请求但未强制要求客户端证书如仅做可选认证时未携带证书的连接仍可成功建连计入no_certificate。context_impl.cc 中可见stats_.no_certificate_.inc()的调用。若fail_verify_no_cert持续增长通常是未授权的客户端试图接入或者合法客户端忘记配置证书。fail_verify_error是 CA 信任链校验失败的计数器也是最常见的证书错误来源证书过期、证书链不完整、签发者不在受信任 CA 列表中等都属于此类。它在 context_impl.cc 和 source/common/tls/cert_validator/default_validator.cc 的多个校验失败分支中都会被触发。fail_verify_san专门统计主机名校验失败证书本身在 CA 层面合法但其 SAN 字段不包含目标主机名。该指标在 default_validator.cc 中于证书链校验通过后的主机名比对阶段触发。它对于排查证书有效但域名不匹配的经典问题极具针对性。fail_verify_cert_hash统计证书固定pinning校验失败次数见 default_validator.cc。当配置了证书哈希白名单而实际证书不在名单中时触发通常意味着上游证书被替换或轮换后固定配置未同步更新。OCSP 装订策略指标OCSP在线证书状态协议装订用于实时校验证书是否被吊销。Envoy 在 source/common/tls/default_tls_certificate_selector.cc 中根据选定的证书上下文与ocsp_staple_policy计算装订动作并分发到四个计数器。指标名类型含义ocsp_staple_failedCounter不符合 OCSP 策略要求而失败的 TLS 连接总数ocsp_staple_omittedCounter未装订 OCSP 响应但连接成功的 TLS 连接总数ocsp_staple_responsesCounter存在有效 OCSP 响应无论客户端是否请求装订的 TLS 连接总数ocsp_staple_requestsCounter客户端明确请求 OCSP 装订的 TLS 连接总数OCSP 策略来自 Listener 传输套接字配置中的ocsp_staple_policy取值为lenient_stapling、strict_stapling或must_staple解析逻辑见 source/common/tls/server_context_config_impl.cc。在 default_tls_certificate_selector.cc 中装订动作的每种结果分别计数提供了合法装订响应计入ocsp_staple_responses因客户端未请求或策略允许而跳过装订且连接继续成功计入ocsp_staple_omitted因违反must_staple等强制策略导致连接被拒计入ocsp_staple_failed。监控建议在采用must_staple策略的 Listener 上ocsp_staple_failed必须保持为 0否则说明服务端证书未正确配置 OCSP 装订会直接导致合法客户端无法建连。加密套件与协议动态指标除固定指标外还有四组动态展开的计数器分别按实际协商结果以通配符形式展开指标名类型含义ciphers.cipherCounter使用密码套件cipher成功建连的连接总数curves.curveCounter使用 ECDHE 曲线curve成功建连的连接总数sigalgs.sigalgCounter使用签名算法sigalg成功建连的连接总数versions.versionCounter使用 TLS 协议版本version成功建连的连接总数这类指标属于按需统计的动态计数器例如当客户端实际协商到TLS_AES_128_GCM_SHA256时Envoy 会维护listener.address.ssl.ciphers.TLS_AES_128_GCM_SHA256这一计数器。它们的实战价值在于观察versions.*的分布评估是否还有客户端在打 TLSv1.2或更老的版本流量辅助制定下线旧协议的排期观察ciphers.*与curves.*确认主流客户端实际使用的套件与曲线是否符合安全基线及时发现对弱套件的协商观察sigalgs.*了解实际使用的证书签名算法分布辅助评估向 ECDSA 或 Ed25519 证书迁移的影响面。源码层面的实现依据ssl_stats.rst中 20 个指标的完整定义可在 source/common/tls/stats.h 的ALL_SSL_STATS宏中找到一一对应关系且全部为 Counter 类型握手与会话类connection_error、handshake、session_reused在 source/common/tls/context_impl.cc 的握手回调中递增证书验证类no_certificate、fail_verify_no_cert、fail_verify_error、fail_verify_san、fail_verify_cert_hash其中 SAN 与证书固定相关计数分布在 source/common/tls/cert_validator/default_validator.ccOCSP 类ocsp_staple_failed、ocsp_staple_omitted、ocsp_staple_responses、ocsp_staple_requests在 source/common/tls/default_tls_certificate_selector.cc 的装订决策路径中递增。理解这些计数器的源码触发位置能帮助你判断指标上涨背后的真实事件类型避免把证书问题误判为网络问题。实战TLS 统计的监控与告警建议结合以上指标可以搭建一套完整的 TLS 健康度监控握手失败率告警对listener.*.ssl.connection_error与各fail_verify_*计数器的变化率delta设置阈值异常突增时触发告警。证书过期前兆fail_verify_error缓慢而持续增长往往预示证书临近过期或 CA 链被破坏应结合证书过期时间指标提前处理。mTLS 接入审计fail_verify_no_cert与fail_verify_san分别对应缺证书与证书域名不符是定位非法客户端接入行为的直接依据。协议版本治理通过versions.*的动态分布确认旧版 TLS 流量占比为协议下线决策提供数据支撑。OCSP 合规在must_staple策略下监控ocsp_staple_failed是否为 0。最后提醒上述指标名在 Envoy 的 stats 输出中均带有命名空间前缀listener.address.ssl.或cluster.name.ssl.且会话复用比例、握手成功率等衍生指标需由session_reused、handshake等原始计数器自行计算Envoy 不会直接给出百分比形式的统计这一点在设计告警规则时需要注意。【免费下载链接】envoyCloud-native high-performance edge/middle/service proxy项目地址: https://gitcode.com/GitHub_Trending/en/envoy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考