HTTPS 解密(中间人攻击,MitM)

Chute 可以通过 MitM 解密 HTTPS 流量。更多信息请参阅 Wikipedia 文章。在 iPhone、Apple TV 和 Android 上,这都是需要许可证的功能,并且由引擎强制执行:没有许可证时,无论配置怎么写,都不会解密任何内容。见许可证与激活。

证书生成器可以帮助你生成一个新的 CA 证书用于调试,并使该证书被系统信任。此功能在 Chute Mac 与 Chute iOS 的配置编辑器中可用。该证书在本地生成,仅保存在你的配置文件中和系统钥匙串中。新证书的密钥使用 OpenSSL 随机生成。Chute Android 没有证书生成器:在编辑器的MitM → 配置 CA中导入现有的 PKCS#12,安装 CA会把其中的 CA 证书交给 Android 的证书安装器——见安装并信任 CA 证书。

你也可以使用已有的 CA 证书。将证书导出为 PKCS#12 格式(.p12)并设置密码。请注意,密码不能为空;不带密码的 PKCS#12,Chute 会拒绝加载。使用 "base64" 命令编码为 base64 字符串,并将以下设置追加到你的配置文件中。

[MITM]
enable = true
ca-p12 = MIIJtQ.........
ca-passphrase = password
hostname = *google.com

Chute 仅解密此处声明的主机的流量,所以请务必设置它。在所有平台上,一个已启用但没有声明 hostname 的 [MITM] 段什么都不解密——不论是完全没写这个键,还是只给了 hostname-disabled 条目。经 HTTP 代理时,只有经 CONNECT 进来的 HTTPS 会被解密:明文 HTTP 请求即使其主机列在 hostname 中,也照常转发。

支持通配符 和 ?。请注意,? 只有在规则中同时包含 `时才作为通配符使用;只包含?` 的规则会按字面值比较。

  • 使用前缀 - 来排除主机名。条目按书写顺序检查,由第一个匹配的条目决定结果,所以排除项必须写在它要从中剔除的那个条目之前:hostname = -*.apple.com, * 不会动 apple.com,而 hostname = *, -*.apple.com 会解密它。
  • 默认情况下,仅发往 443 端口的请求会被解密。
    • 使用后缀 :port 来允许其他端口。
    • 使用后缀 :0 来允许所有端口。

示例:

  • -*.apple.com:排除所有发往 *.apple.com 443 端口的请求。
  • www.google.com:允许对 www.google.com 的 443 端口进行 MitM。
  • www.google.com:8080:允许对 www.google.com 的 8080 端口进行 MitM。
  • www.google.com:0:允许对 www.google.com 的所有端口进行 MitM。
  • *:允许对所有 443 端口的主机名进行 MitM。(不推荐)
  • *:0:允许对所有主机的所有端口进行 MitM。(不推荐)

四个关键字代表整类目标,和主机名一样可以加 - 前缀与 :端口 后缀:<ip-address>(任何直接连到 IP 字面量的连接)、<ipv4-address>、<ipv6-address> 和 <simple-hostname>(不含点的名字,如 intranet)。hostname = -<simple-hostname>, * 解密除单段名字以外的一切,hostname = <ip-address> 只解密连到地址的连接。地址类关键字只对经 HTTP 代理发往某个地址的 CONNECT 起作用:TUN 连接只按主机名解密——Chute 为它解析的那个名字,或者在开启 sniffing-enabled 时其 TLS 握手中的服务器名——所以一条直接连到裸地址、又没有服务器名的连接永远不会被解密。

主机名条目还可以在第一个 / 之后包含路径模式。但是否解密是在连接建立时决定的——收到 CONNECT 时,或 TUN 会话开始时——那时还不知道请求路径,所以带路径的条目在主机匹配时会解密整条连接,而 -host/path 形式的排除根本不会生效。不要用它来把某个主机排除在解密之外。

  • example.com/api/*:允许对 example.com 的 443 端口进行 MitM;路径不会缩小范围。

一个通用的配置可能如下:

hostname = -*.apple.com, -*.icloud.com, *

Chute 将对所有 MitM 请求应用 URL 重写、Header 重写、Body 重写和模拟响应([Map Local])规则以及脚本——已解密连接上的每一个请求都是如此,而不只是第一个。已解密的 HTTP/1.1 连接只承载一次交换:响应发完后 Chute 就关闭这条连接,客户端会在一条新连接上发出下一个请求,新连接也按同样的方式处理;在同一条连接上跟在首个请求后面的流水线请求不会被处理,客户端会在新连接上重发。例外是 Chute Android 从 VPN 解密的连接:它保持打开,其中的请求逐个按同样方式处理;不过 Chute 自己给出应答(模拟响应、URL 重写的应答、脚本的 response)之后会关闭这条连接;如果响应的正文来自一个只在响应头上运行的 http-response 脚本,发出该响应之后也会关闭。HTTP/2 连接保留自己的连接,WebSocket 升级也是:收到 101 响应之后,数据在两个方向上原样通过。

MitM 支持 HTTP/2,经 HTTP 代理和经 TUN 进来的连接都一样。在与服务器进行 TLS 握手之前,Chute 会先读出客户端提供的协议(ALPN):客户端提供了 h2,并且 [MITM] 没有设置 h2 = false 时,向服务器提供 h2 和 http/1.1,否则只提供 http/1.1。随后向客户端提供服务器选定的协议,所以两边说的始终是同一种协议;客户端没有提供这种协议时,Chute 不回复 ALPN,握手照常继续。在 HTTP/2 上,trailers(例如 gRPC 的 grpc-status)和 103 Early Hints 这类 1xx 临时响应会原样转发,规则和脚本都看不到它们。Surge 的 [MITM] 键 tcp-connection 在配置文件中会被接受但会被忽略。

某些应用程序具有严格的安全策略,使用固定证书或 CA。对这些主机启用解密可能会导致问题。

Chute 会把自己签发的主机证书放在一个证书库里,库满时淘汰最久未使用的一张:macOS 保留 512 张,iOS、tvOS 与 Android 保留 128 张。

安装并信任 CA 证书

生成(或导入)CA 只完成了一半——操作系统还必须信任它。两步都完成之前,所有被解密的网站都会报证书错误。应用内的证书页面会显示当前状态(「受信任的 CA 证书」/「不受信任的 CA 证书」)。

Chute iOS —— 在配置编辑器中打开MITM → 配置 CA:

  1. 生成新的 CA 证书(已有证书则用导入 P12 证书)。
  2. 点将 CA 证书安装到系统。会打开一个 Safari 页面——点Install Certificate并允许下载,然后在设置 → 通用 → VPN 与设备管理中安装已下载的描述文件。
  3. 信任它:设置 → 通用 → 关于本机 → 证书信任设置,为 Chute 的 CA 打开完全信任开关。这一步最容易被漏掉——不做它证书只是「已安装」而非「已信任」,解密会一直失败。

Chute Mac —— 在配置窗口中打开MitM:

  1. 生成新证书(或从 PKCS#12 文件导入证书)。
  2. 点安装证书到系统。macOS 会请求管理员密码,并把证书作为受信任的根证书写入系统钥匙串——无需再手动操作「钥匙串访问」。
  3. 导出证书可以保存一份 .pem,用于安装到其他设备。

Chute Android —— 在配置编辑器中打开MitM → 配置 CA:

  1. 导入 P12会把现有的 PKCS#12 以 base64 形式写入 ca-p12,和 Apple 平台上的应用一样,因此配置会把它的 CA 带到其他设备上;在CA 密码短语中填入它的密码。Chute Android 没有证书生成器。指向某个文件的 ca-p12——旧版编辑器就是这样写的——仍然可以读取。
  2. 安装 CA会把该 P12 中的 CA 证书交给 Android 的证书安装器。从 Android 11 起,应用不能再用这种方式安装 CA 证书:请改为在系统的安全设置中从证书文件安装——用它的 .pem 或 .crt 副本,例如 Chute Mac 上导出证书保存的那一份。
  3. Android 会把它放在用户证书中,而以 Android 7.0 或更高版本为目标的应用只有在主动选择时才信任这些证书。因此很多应用在证书安装之后仍会握手失败——把它们的主机从 hostname 中排除。

如果证书已受信任但某个应用仍然失败,它多半固定(pin)了自己的证书——用 - 前缀把它的主机从 hostname 中排除即可,不必硬碰。

选项

skip-server-cert-verify

skip-server-cert-verify = true

在执行 MitM 时不验证远程主机的证书。启用后,Chute 将接受上游服务器提供的任何证书,包括自签名或无效的证书。这对开发环境很有用,但会降低安全性。

[MITM]
enable = true
ca-p12 = MIIJtQ.........
ca-passphrase = password
skip-server-cert-verify = true
hostname = *google.com

安全说明:启用 skip-server-cert-verify 会使 MitM 连接容易受到 Chute 与上游服务器之间的中间人攻击。仅在受信任的网络或开发环境中启用此选项。

hostname-disabled

hostname-disabled = *.bank.example, pay.example.com:8443

永远不解密的主机,即使 hostname 中有条目覆盖它们。通配符的用法与 hostname 相同,:port 把条目限定到一个端口。适合在不修改模块的情况下关闭模块添加的主机。

auto-quic-block

auto-quic-block = true

阻断发往所有将被解密的主机的 QUIC,让 HTTP/3 客户端回落到基于 TCP 的 TLS,这样 MitM 就能看到流量。它是 block-quic 之外的补充,而不是替代。

S. Smart Rabbit LLC © All Rights Reserved            updated 2026-09-29 21:57:05

本页为英文版的翻译。如内容有出入,以英文版为准。

results matching ""

    No results matching ""