You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mitmproxy多级上游代理分流场景下证书错误问题排查求助

问题根因

  1. TLS握手时机前置:mitmproxy的TLS握手阶段早于request事件触发,你配置的入口代理默认上游是8083,访问github的请求会先和8083完成TLS握手、拿到8083签发的github证书后,才会触发request事件执行上游切换逻辑。此时再切换到8082会出现证书链不匹配问题,直接触发校验错误,流量还没走到8082就会中断,所以8082端口没有对应日志。
  2. 二级代理证书未统一:两个二级代理(8082/8083)默认会各自生成独立的根证书,入口代理没有同时信任两个二级代理的根证书,会抛出自签名证书链错误;同时切换上游后证书链传递异常,也会触发iPhone客户端的握手失败。
  3. 上游切换API调用时机错误:change_upstream_proxy_server方法需要在TLS握手完成前调用才能生效,在request阶段调用已经错过时机。你之前尝试的--set add_upstream_certs_to_client=true参数无法解决证书链混乱的核心问题,不需要保留。

修复方案

1. 统一二级代理的根证书

先导出任意一个mitmproxy实例的默认根证书,给两个二级代理都使用同一个根证书启动,避免证书链冲突:

  • 二级代理8083启动命令修改为:
    mitmproxy --listen-port 8083 --ssl-insecure --certs *=统一根证书路径.pem
  • 二级代理8082启动命令修改为:
    mitmproxy --listen-port 8082 --ssl-insecure --certs *=统一根证书路径.pem
  • 入口代理启动时新增信任该统一根证书的配置,添加参数--set ssl_verify_upstream_trusted_ca=统一根证书路径.pem

2. 调整上游切换的触发时机

将上游切换逻辑从request事件改为在http_connect事件中执行,这个阶段会处理HTTPS的CONNECT请求,还未完成TLS握手,切换上游可以正常生效:
修改mitmRoot.py脚本内容如下:

from mitmproxy import http
from mitmproxy.proxy import server

class mitmRoot:
    def http_connect(self, flow: http.HTTPFlow):
        if "github.com" in flow.request.host:
            flow.server_conn.via = server.ServerSpec.from_url("http://localhost:8082")
        else:
            flow.server_conn.via = server.ServerSpec.from_url("http://localhost:8083")

addons = [
    mitmRoot()
]

3. 调整入口代理启动参数

去掉原来的默认上游配置--mode upstream 127.0.0.1:8083,改为普通代理模式,所有上游切换逻辑都在脚本中控制,避免默认配置和脚本逻辑冲突:
入口代理最终启动命令为:
mitmproxy -s mitmRoot.py --ssl-insecure --set ssl_verify_upstream_trusted_ca=统一根证书路径.pem

4. 客户端校验

如果仍然出现客户端握手错误,确认iPhone上安装的是入口代理的根证书,且已经在设置-通用-关于本机-证书信任设置中开启了该证书的完全信任权限。

内容的提问来源于stack exchange,提问作者ArcTropics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:09:02