如何在Mitmproxy插件中正确发起HTTP/HTTPS网络请求
Mitmproxy插件内部发起HTTP请求的解决方案
问题根因
你遇到的报错本质是请求链路出现死循环:Mitmproxy启动后默认会接管系统代理,你在插件内调用requests时,默认会走Mitmproxy自身的代理,导致请求回环,最终出现超时、SSL校验失败等问题。
方案1:请求直接走直连(最常用,适合不需要经过Mitmproxy处理的第三方请求)
直接在requests请求参数中显式禁用代理即可,不需要配置任何代理信息,示例代码如下:
import requests # 替换为你要请求的目标地址 target_url = "https://example.com/your-endpoint" # 显式禁用代理,让请求直接走公网链路,不经过Mitmproxy resp = requests.get( target_url, proxies={"http": None, "https": None}, # 若目标站点证书不受信,可临时加verify=False,生产环境建议指定可信CA证书路径 # verify=False )
这个方案可以直接解决你遇到的ValueError: check_hostname requires server_hostname和代理超时两类报错。
方案2:请求需要经过Mitmproxy处理
如果你确实需要让插件内发起的请求也经过Mitmproxy的规则过滤/修改,需要修正你之前的代理配置:
- HTTPS代理的地址前缀要写
http而非https,Mitmproxy的代理端口接收的是HTTP类型的代理请求 - 显式指定Mitmproxy的根证书路径,避免SSL校验报错
示例代码如下:
import requests mitmproxy_port = 8080 # 替换为你实际的Mitmproxy监听端口 # 替换为你本地Mitmproxy根证书的实际路径,Windows默认路径为C:\Users\用户名\.mitmproxy\mitmproxy-ca-cert.pem ca_path = r"C:\Users\Administrator\.mitmproxy\mitmproxy-ca-cert.pem" proxies = { "http": f"http://127.0.0.1:{mitmproxy_port}", "https": f"http://127.0.0.1:{mitmproxy_port}" } resp = requests.get( "https://example.com/your-endpoint", proxies=proxies, verify=ca_path )
注意事项
不要在response事件回调中发起耗时过长的同步请求,否则会阻塞Mitmproxy的流量转发逻辑,影响整体性能。
内容的提问来源于stack exchange,提问作者arslancharyev31
相关产品推荐
相关产品推荐

