资讯动态

mirrord HTTPS 窃取深度解析:用 TLS 终结证书解密偷取入站流量(MirrordTlsStealConfig 完整配置指南)

发布时间:2026/10/15 4:47:14 来源:尧图企业网站定制
开发工具云原生CLI【免费下载链接】mirrordRun any process, on your machine or in an AI agents environment, as if it were a pod in your Kubernetes cluster: real env vars, DNS, network, traffic.项目地址https://gitcode.com/gh_mirrors/mi/mirrord点击查看免费下载mirrord 支持在所有版本中偷取steal入站 HTTPS 请求但当集群中的应用直接接收加密流量、由应用自身做 TLS 终结TLS termination时带过滤器偷取加密流量的能力属于 mirrord for Teams 功能。本文基于官方文档 steal-https.md完整讲解集群侧MirrordTlsStealConfig/MirrordClusterTlsStealConfig资源的每个字段、本地侧feature.network.incoming.tls_delivery的全部配置项并结合 mirrord-agent 源码说明 agent 如何以 TLS 服务器身份终结被窃取的连接、再以 TLS 客户端身份回连应用以及应用到底看到哪张证书这一关键问题的底层机制。一、HTTPS 窃取的工作模型agent 不是转发器而是双向 TLS 端点与普通的 TCP 流量偷取不同未被窃取命中的请求并不是逐字节转发not forwarded byte for byte的。mirrord-agent 的流程是以TLS 服务器身份终结调用方原始请求发送者的 TLS 连接从而读到明文请求判断是否命中窃取过滤器命中则把请求交给本地应用未命中则以TLS 客户端身份agentAsClient配置自己发起一条新的 TLS 连接回连应用透传请求。这一点可以从源码得到印证StealTlsHandler 同时持有server_config用于acceptor()构建TlsAcceptor和client_config用于构建回连应用的PassThroughTlsConnector而 StealTlsHandlerStore 按端口缓存构建好的 handler配置在 agent 启动时读取STEAL_TLS_CONFIG环境变量注入见 entrypoint/setup.rs。推论应用永远看不到原始调用方的证书——agent 不持有调用方的私钥无法出示那张证书。如果应用按证书名称subject/SAN授权调用方你需要给agentAsClient.authentication配置一张应用接受的证书。特别地把它指向应用自己的证书会让应用看到自己作为调用方这类允许名单通常会以 403 拒绝。此外agent 只在启动时读取一次配置而 Operator 会复用同一 target 上正在运行的 agent 来处理新会话。修改agentAsClient后必须停止该 target 上的会话、等待其mirrord-agentpod 退出后再启动新会话否则新会话仍沿用旧证书。二、版本要求与适用前提按文档明确说明带过滤器的 HTTPS 窃取要求mirrord-operator ≥3.106.0且mirrord-agent ≥1.134.0agentAsClient.verification.serverName字段要求mirrord-operator ≥3.210.0且mirrord-agent ≥3.262.0该功能仅对Team 与 Enterprise 套餐开放。配置结构的权威定义位于 mirrord/agent/env/src/steal_tls.rs其中StealPortTlsConfig、AgentServerConfig、AgentClientConfig均使用#[serde(rename_all camelCase)]与下文 YAML 中的agentAsServer、agentAsClient等 camelCase 键一一对应。三、集群侧配置MirrordTlsStealConfig 资源要让 mirrord 用户能带过滤器地偷取 HTTPS 请求必须为 mirrord Operator 提供关于你 TLS 部署的洞察力方式是创建专用自定义资源CRDMirrordTlsStealConfig命名空间作用域只对该命名空间内的 target 生效MirrordClusterTlsStealConfig集群作用域对整个集群的 mirrord target 生效。两者外观与用法几乎相同唯一区别就是作用域。警告targetPath和selector是把配置限定到某个 workload 的手段。两者都不设置时该配置会应用到它作用域内命名空间或整个集群所有监听其端口的 mirrord target无论该 target 是否真的匹配这套证书与校验规则。下面是一个为example-deploy-namespace命名空间中example-deployDeployment 配置 HTTPS 窃取的完整示例字段注释继承自文档并结合源码补充apiVersion: mirrord.metalbear.co/v1alpha kind: MirrordTlsStealConfig metadata: # 名称仅起标识作用说明这是给 example-deploy 用的配置 # mirrord Operator 并不检查配置资源的名称。 name: tls-steal-config-for-example-deploy # 这是命名空间作用域的资源必须与 example-deploy 部署位于同一命名空间。 namespace: example-deploy-namespace spec: # 与会话 target 路径匹配的通配符模式。 # # 模式可包含 * 与 ? # 1. * 匹配任意数量的任意字符 # 2. ? 恰好匹配一个任意字符。 # # 例如 deploy/*/container/container-? 同时匹配 # deploy/name/container/container-1 与 deploy/another-name/container/container-2。 # # mirrord 会话 target 路径由以下部分组成 # 1. target 资源类型deploy、pod、rollout、statefulset 等 # 2. target 资源名 # 3. 字面量 container当用户指定了具体容器作为 target 时 # 4. target 容器名当用户指定了具体容器作为 target 时。 # # 注意用户既可以间接地通过部署deployment来 target 它的 pod # 也可以直接 target pod也可以指定或不指定具体容器。 # # 可选。默认是一个匹配所有 target 的模式。 targetPath: */example-deploy* # 与会话 target 标签匹配的选择器。 # # 可选。默认是一个匹配所有标签的选择器。 selector: matchLabels: app: example-deploy # 可以针对 target 的每个端口单独配置。 ports: # 本条目配置从 443 端口窃取 HTTPS。 - port: 443 # 配置 agent 作为 TLS 服务器时如何认证自己、如何校验客户端原始请求发送者。 agentAsServer: # 服务器如何认证自己。 authentication: # 包含证书链的 PEM 文件路径。 # 文件至少包含一张证书可以包含其他类型的条目如私钥会被忽略。 # 证书应按要求从终端实体end-entity到根证书排列。 certPem: /path/to/server/cert.pem # 与 certPem 证书链匹配的私钥 PEM 文件路径。 # 文件必须恰好包含一个私钥其他类型条目会被忽略。 keyPem: /path/to/server/key.pem # 服务器支持的 ALPN 协议按偏好排序。 # # 为空时禁用 ALPN。 # # 可选。默认为空列表。 alpnProtocols: - h2 - http/1.1 - http/1.0 # 服务器如何校验客户端。 # # 可选。不存在时服务器完全不提供 TLS 客户端认证。 verification: # 是否接受匿名无证书客户端。 # 可选。默认 false。 allowAnonymous: false # 服务器是否接受任何证书无论其有效性及签名者。 # # 注意此项不影响是否接受匿名客户端。 # 若未设置 allowAnonymous仍然要求客户端提供某张证书。 # # 可选。默认 false。 acceptAnyCert: false # 包含允许根证书的 PEM 文件与目录路径列表。 # 目录不会递归遍历。 # 文件中找到的每张证书都视为允许的根证书其他类型条目会被忽略。 # # 可选。默认为空列表。 trustRoots: - /path/to/trusted/client/root/cert.pem # 配置 agent 作为 TLS 客户端时如何认证自己、如何校验服务器原始请求目的地 # 即 target 容器内运行 TLS 服务的应用。 agentAsClient: # 客户端如何认证自己。 # # 可选。不存在时客户端以匿名方式建立连接。 authentication: # 包含证书链的 PEM 文件路径。 # 文件至少包含一张证书其他类型条目会被忽略。 # 证书应从终端实体到根排列。 certPem: /path/to/client/cert.pem # 与 certPem 证书链匹配的私钥 PEM 文件路径。 # 文件必须恰好包含一个私钥其他类型条目会被忽略。 keyPem: /path/to/client/key.pem # 客户端如何校验服务器。 verification: # 是否接受任何证书无论其有效性及签名者。 # 可选。默认 false。 acceptAnyCert: false # 当原始客户端未发送 SNI 时用于校验服务器证书并写入 SNI 扩展的名称。 # # 当证书是按 DNS 名签发、而原始客户端不发 SNI例如 nginx 上游时务必设置 # 否则 mirrord-agent 会用 pod 的 IP 地址来校验证书这类证书并不覆盖该 IP。 # # 可选。mirrord-agent 的取值顺序为原始客户端的 SNI → 此名称 → # 请求的 host → pod 的 IP 地址。 serverName: example-deploy # 包含允许根证书的 PEM 文件与目录路径列表。 # 目录不会递归遍历文件中找到的每张证书都视为允许的根证书。 # # 可选。默认为空列表。 trustRoots: - /path/to/trusted/server/root/cert.pem多配置的合并规则每个MirrordTlsStealConfig/MirrordClusterTlsStealConfig资源为一组可用的 mirrord target 配置 HTTPS 窃取借助spec.targetPath与spec.selector可以把一个配置资源关联到多个 pod、deployment、rollout 等。当 Operator 发现多个配置资源同时匹配同一个会话 target 的路径与标签时它会合并它们的ports列表同一个端口不允许被配置多次多余的条目会被丢弃。重要证书文件从哪里读取mirrord-agent 会在 target 容器的文件系统内搜索配置资源引用的所有文件与目录。这不是文档的空头说明——源码中StealTlsHandlerStore持有InTargetPathResolver见 path_resolver.rs其from_pid构造函数以/proc/{target_pid}/root为根把容器内路径解析为宿主机可达路径并处理符号链接上限 40 跳与 Linux 默认一致。因此上面certPem等路径都应是target 容器内存在的路径agent 通过 target 进程的根文件系统读取它们。源码视角agent 如何按配置构建 TLS 端点build_server_config 与 build_client_configs 实现了上述 YAML 字段的落地逻辑其中有几个值得注意的实现细节agentAsServer.verification缺省 → 使用NoClientAuth服务器完全不要求客户端证书acceptAnyCert: true→ 使用危险的DangerousNoVerifierClient校验器仍会记录证书 subject 用于身份匹配否则用WebPkiClientVerifier按trustRoots校验allowAnonymous: true时通过allow_unauthenticated()放行匿名客户端若信任库为空又要求匿名接入源码会插入一张自签 dummy 证书满足WebPkiClientVerifier至少需要一个信任锚的要求agentAsClient.verification.trustRoots解析后若信任库为空且acceptAnyCert为 false直接报错NoGoodRootALPN 协议按顺序写入ServerConfig.alpn_protocols回连应用时PassThroughTlsConnector会复用原始连接协商出的 ALPN 协议与 SNI见 handler.rs从而尽量让应用侧体验与真实流量一致。进阶agentAsClient.identities 与本地 client_identities身份透传仓库中的 agentAsClient 结构定义 显示AgentClientConfig还支持文档未展开的identities字段当原始客户端出示了证书时agent 透传未命中流量时会优先选择 identities 中与客户端身份SAN 集合无 SAN 时用 subject一致的第一张证书都不匹配或未出示证书时回退到authentication。源码在 StealTlsHandlerStore::get 中有硬性校验配置了identities就必须启用agentAsServer.verification且acceptAnyCert为 false否则报IdentitiesWithoutClientVerification——未经验证的证书身份不可信任何人都可以声称该身份。本地侧同样有对等机制feature.network.incoming.tls_delivery.client_identities让本地投递在向本地应用建立 TLS 连接时选择与原始客户端身份一致的证书见 tls_delivery.rs 的文档注释与 changelog 条目。四、本地侧配置把偷取的 HTTPS 投递给你的本地应用默认情况下mirrord 以原始协议——TLS——把被偷取的 HTTPS 请求投递到本地应用连接由你本地机器上的一个匿名 TLS 客户端发起并且不校验服务器证书。该行为通过 mirrord 配置文件中的feature.network.incoming.tls_delivery调整旧的feature.network.incoming.https_delivery选项已弃用应改用tls_delivery。源码层面二者互斥且弃用会有告警config/src/lib.rs 中同时设置两者会直接报冲突错误只设置https_delivery会收到 deprecated, usetls_deliveryinstead 警告字段定义见 incoming.rs。若你的本地应用要求客户端证书mTLS / 双向 TLS请设置tls_delivery.client_cert与tls_delivery.client_key为它接受的证书。不设置的话握手会以BadCertificate告警失败每个被偷取的请求都会被以 502 应答。配置文件中的校验逻辑verify会在 mirrord 启动前就拒绝只有证书没有私钥或只有私钥没有证书的半成品配置。最小可用示例对应文档 JSON 并补全字段注释{ feature: { network: { incoming: { tls_delivery: { protocol: tls, client_cert: /path/to/client/cert.pem, client_key: /path/to/client/key.pem } } } } }结合源码 LocalTlsDelivery完整字段说明如下字段说明protocol本地投递协议默认tls设为tcp时以明文 TCP 投递此时其余 TLS 相关设置全部被忽略见 verify 源码 及测试verify_ignores_client_auth_for_tcp_deliverytrust_roots允许的根证书 PEM 文件/目录列表目录不递归遍历。与server_cert互斥且不能为空列表server_name建立连接使用的服务器名必须是合法 DNS 名或 IP 地址不合法会在配置校验阶段报错。未提供时的取值顺序server_cert终端实体证书中的有效名称 → 原始客户端 SNI → 被偷请求 URL 中的名称 →localhostserver_cert本地应用 TLS 服务器使用的证书链 PEM 文件路径与trust_roots互斥client_cert/client_key出示给本地应用的客户端证书链与私钥必须成对设置client_cert_source默认为local从本机读取target表示从 target 容器内读取仅 preview 会话支持mirrord exec无此权限设为target但未给文件路径会被校验拒绝client_identities本地应用按客户端身份授权时的额外证书列表原始客户端出示证书时优先出示身份匹配的一张否则回退client_cert/client_key这些文件始终从本机读取默认情况下本地 mirrord TLS 客户端会信任本地应用出示的任何证书源码使用DangerousNoVerifierServer见 intproxy/src/proxies/incoming/tls.rstrust_roots与server_cert用于覆盖这一行为。上述本地 TLS 投递在 intproxy 侧由 proxies/incoming/tls.rs 实现其中还支持RenewableClientCert客户端证书文件被原地轮换例如 sidecar 定期重写时新连接始终出示最新证书已建立连接保持原证书不变。五、Preview 环境的特殊规则同样的两项设置client_cert/client_key以及server_name适用于 preview environments在 preview 会话中是mirrord Operator负责向 preview pod 发起 TLS 连接因此mirrord preview start会在本地读取这两个文件并把它们存入会话的 Secret与secret_mounts并列由 Operator 在投递被偷请求时出示该证书server_name同样生效其他tls_delivery设置对 preview 不适用preview 的投递永远是 TLS且不会校验 preview pod 的证书client_identities等设置同样不适用于 preview见 tls_delivery.rs 文档注释若 target 自身进程已持有 preview pod 接受的客户端证书preview 可以就地使用它而不必把文件复制出集群把client_cert/client_key指向 target 容器内的路径并设置client_cert_source: targetOperator 会从 target 的运行中 pod 读取文件对应TlsClientCertSource::Target见 枚举定义。六、配置核查清单快速自查集群侧确认 Operator/Agent 版本满足要求3.106.0/1.134.0serverName需3.210.0/3.262.0MirrordTlsStealConfig与目标 Deployment 位于同一命名空间且targetPath/selector精确匹配到你的 target避免配置泄漏给同命名空间其他监听相同端口的 target所有 PEM 路径均为target 容器内的路径且证书链按终端实体 → 根排列、私钥文件恰好包含一个私钥应用按证书授权调用方时agentAsClient.authentication指向应用接受的证书不要指向应用自己的证书修改agentAsClient后停掉该 target 的会话并等待旧mirrord-agentpod 退出本地应用要求 mTLS 时tls_delivery.client_cert与client_key成对设置遇到 502 BadCertificate即指向此处弃用项把https_delivery迁移为tls_delivery且两者不要同时出现。相关源码与文档索引集群侧配置结构定义mirrord/agent/env/src/steal_tls.rsagent 端 TLS 终结与回连实现mirrord/agent/src/incoming/tls.rs、mirrord/agent/src/incoming/tls/handler.rs容器内路径解析mirrord/agent/src/util/path_resolver.rs本地投递配置与校验mirrord/config/src/feature/network/incoming/tls_delivery.rs本地 TLS 投递实现含可轮换客户端证书mirrord/intproxy/src/proxies/incoming/tls.rs同目录相关文档filter-incoming-traffic.md、inspect-live-traffic.md赞分享开发工具云原生CLI【免费下载链接】mirrordRun any process, on your machine or in an AI agents environment, as if it were a pod in your Kubernetes cluster: real env vars, DNS, network, traffic.项目地址https://gitcode.com/gh_mirrors/mi/mirrord点击查看免费下载相关推荐DeepTutor学习游戏化如何让学习变得更有趣DeepTutor学习游戏化如何让学习变得更有趣 在当今信息爆炸的时代保持学习动力成为许多人的挑战。DeepTutor作为一款AI原生个性化学习助手通过创人工智能AI 应用AI Agent多智能体RAG教育后端前端Got 高级 HTTPS 配置完全指南证书、mTLS 与 TLS 选项深度解析Got 高级 HTTPS 配置完全指南证书、mTLS 与 TLS 选项深度解析 Got 作为 Node.js 生态中广受欢迎的 HTTP 请求库其 http后端网络Puppeteer HTTPResponse.securityDetails() 深度解析读取 HTTPS 响应的 TLS 证书安全详情Puppeteer HTTPResponse.securityDetails 深度解析读取 HTTPS 响应的 TLS 证书安全详情 导读 HTTPRespo浏览器控制测试网页爬虫开发工具上一篇GetQzonehistory一键完整备份你的QQ空间数字记忆下一篇GetQzonehistory5分钟免费备份QQ空间完整历史说说的终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑