MitM 以及 HTTP(S) Rewrite
此功能目前仍属于实验性功能,如配置后连接出现问题请暂时关闭该功能并通过邮件或 Telegram 群组反馈。
当前版本的 MitM 支持对 HTTP(S) 请求的 URL 进行匹配以及 URL Rewrite,后续版本可能会增加 Headers 匹配/改写、运行脚本等更多功能。
准备
准备 CA 证书
在启用 MitM 之前,需要有一个 CA 证书。
由于当前版本的 app 不支持自动生成,您可以导入已有的 CA 证书,或通过其他工具创建新的 CA 证书。
导入已有 CA 证书
如您已有可用 PKCS 12/PFX 证书(例如您已经正在使用其他支持 MitM 的软件,或部署私有 PKI 系统),可将其进行 base64 编码,并保存编码后的结果备用。
您同时还需要创建该证书时指定的密钥。
对于大部分用户来说,您可能已有可用证书(及其密钥)。
创建全新 CA
- macOS 参考:https://support.apple.com/zh-cn/guide/keychain-access/kyca2686/mac
- Linux/Windows 参考:
- 使用 cfssl 生成 PEM 格式证书和密钥:https://rob-blackbourn.medium.com/how-to-use-cfssl-to-create-self-signed-certificates-d55f76ba5781
- 将 PEM 格式转换为 PFX:https://stackoverflow.com/a/808742/1109167
对于大部分用户,您可能已有可用 CA 证书。如您有安全性顾虑,建议创建个人 CA 证书。
将 P12 证书转换为 base64 编码:
$ base64 /path/to/your.p12
...
...
...
至此,应该已经准备好了:
- base64 编码的 p12 格式 CA 证书
- 该证书对应的密钥
信任证书
上一步准备好的 pfx 证书发送到手机(通过邮件/AirDrop等方式并在手机中打开安装该证书。
安装好后,进入系统设置,手动信任该证书。参考:https://support.apple.com/zh-cn/HT204477#:~:text=If%20you%20want%20to%20turn,Mobile%20Device%20Management%20(MDM))
至此,准备工作结束。
配置
MitM
由于 clash 使用 yaml 格式的配置文件,为保持一致性,MitM 相关功能仍然通过 yaml 配置文件来设置。
相关的配置项:
mixed-port: 8080 # 原有 clash 配置
# 新增以下配置项
mitm:
enable: true # 是否开启
hostnames: # 需要进行 MitM 匹配的 hostname,支持通配符 *
- '*.google.com'
- www.qq.com
ca:
passphase: "填入上一步准备好的证书密钥"
certificate: "填入上一步准备好的证书 base64 编码"
至此 MitM 配置完毕。
如果 log-level 设置为 debug,匹配 MitM hostname 的请求会出现在日志中。
启用 MitM 后可以解密 HTTPS 请求与响应,由于目前版本不支持显示相关内容,所以无法通过 UI 查看。未来的版本中会增加该功能。
Rewrite
由于仅配置 MitM 目前来说没有任何实际意义,可通过配合 URL Rewrite 规则来实现进阶的规则匹配与处理。
相关的配置项:
port: 8080 # 原有 clash 配置
# 新增以下配置
rewrite:
- regex: ^https?:\/\/api\.douban\.com\/v2\/app_ads\/common_ads
match: url
action: reject-image
target: ""
参数解释:
每一组 Rewrite 规则由以下参数组成:
- regex:需要重写的请求 URL,支持正则表达式
- match:
url
表示匹配请求的 URL。- 目前仅支持
url
一项,之后会新增
- 目前仅支持
- action:
- reject:直接关闭连接
- reject-image:修改该请求的响应,返回 1x1 像素大小的图片文件
- 自定义 status code:例如,200/404 等
- header:会替换请求 header 中的 Host 字段
- target:仅当 action 设置为 3xx status code 时,会设置 Location header 为 target 值,实现 URL 重定向
- 可以使用正则表达式引用例如:
- regex: ^https?:\/\/(www.)?jd\.com\/(.*) match: url action: "302" target: https://www.jd.com/$2
- 关于正则表达式:https://github.com/google/re2/wiki/Syntax
- 可以使用正则表达式引用例如:
更多规则可参考,并更具实际使用场景做出调整:https://raw.githubusercontent.com/Watfaq/choc-configs/main/samples/rewrite.yaml
参考链接
- https://en.wikipedia.org/wiki/Certificate_authority
- https://en.wikipedia.org/wiki/Man-in-the-middle_attack
- https://datatracker.ietf.org/doc/html/rfc7231#section-6
如有疑问,可通过文章顶部邮件/Telegram 用户群组反馈。
也可通过支持 Web3 的浏览器访问本文部署于 IPFS 上的版本:http://choc.watfaq.eth/advanced-usage/mitm.html