.NET6代码发起的API调用绕过mitmproxy无法被抓包问题咨询
.NET 6 程序请求无法被mitmproxy捕获的解决方法
这个问题是.NET 5+在Linux环境下的高频踩坑点,核心原因和对应解决方法如下:
- 不要依赖桌面环境/IDE的代理配置
.NET 内置的HttpClient不会读取Fedora系统设置里的GNOME/KDE桌面代理,也不会继承Rider IDE本身的代理配置(IDE代理仅用于插件下载、资源拉取等IDE自身的网络请求,不会传递给启动的应用进程),它默认只会识别进程级的HTTP_PROXY、HTTPS_PROXY、NO_PROXY三个环境变量。Postman、系统桌面应用能正常被代理捕获,是因为这类应用主动适配了桌面环境的代理配置规则,和.NET的默认行为逻辑不一样,不是代理本身的问题。
终端运行前先在当前会话执行命令配置代理:
核心注意:如果要捕获本地API请求,不要把localhost、127.0.0.1加入NO_PROXY列表,配置时直接留空即可export HTTP_PROXY=http://127.0.0.1:8080 export HTTPS_PROXY=http://127.0.0.1:8080
Rider运行的话,直接打开对应运行配置的「环境变量」选项,把上述三个变量填入即可。export NO_PROXY="" - 关闭回环地址默认绕过代理的逻辑
.NET 6 中HttpClientHandler默认对所有发往回环地址(127.0.0.1、localhost)的请求强制跳过代理,哪怕环境变量配置正确也不会走代理,必须在代码中显式关闭该行为:
如果项目里用var httpHandler = new HttpClientHandler { UseProxy = true, Proxy = new WebProxy("http://127.0.0.1:8080"), // 本地调试阶段可临时放开证书校验,避免mitmproxy证书不被信任导致请求失败 ServerCertificateCustomValidationCallback = (_, _, _, _) => true }; // 用自定义handler初始化HttpClient var httpClient = new HttpClient(httpHandler);IHttpClientFactory做依赖注入,也要在配置客户端时同步传入上述Handler配置,否则默认配置依然会直连。 - 补充证书信任配置
部分Linux发行版下的.NET 运行时不会读取系统全局CA证书存储,哪怕你已经把mitmproxy的CA证书导入系统信任列表也可能报SSL错误,这种情况可以额外加一个环境变量指定mitmproxy证书路径:
配置完成后可以先发一个公网地址的测试请求验证代理是否生效,公网请求能在mitmweb中看到的话,再调整本地API的访问逻辑即可。export SSL_CERT_FILE=~/.mitmproxy/mitmproxy-ca-cert.pem
内容的提问来源于stack exchange,提问作者Fearthainn
相关产品推荐
相关产品推荐

