如何串联mitmproxy与中间普通HTTP代理实现HTTPS和HTTP的双向转换
实现方案
你的核心思路是完全可行的,不需要透明模式、CGI这类复杂方案,核心是绕开mitmproxy默认upstream模式下HTTPS请求走CONNECT隧道不做解密的逻辑,两个节点分别做TLS终止和TLS重封装即可。
第一步:配置第一个mitmproxy(HTTPS转明文HTTP)
这一步的目标是让mitmproxy先完成HTTPS流量的MITM解密,再把明文HTTP请求转发给中间的普通HTTP代理。
- 编写处理脚本
decrypt_forward.py,示例代码如下:
from mitmproxy import http # 替换为你自己的中间普通HTTP代理地址和端口 UPSTREAM_PROXY_HOST = "127.0.0.1" UPSTREAM_PROXY_PORT = 8080 def request(flow: http.HTTPFlow) -> None: # 强制指定上游代理 flow.server_conn.via = http.ServerSpec(UPSTREAM_PROXY_HOST, UPSTREAM_PROXY_PORT) # 强制把请求改为HTTP明文形式发送给上游代理 flow.request.scheme = "http"
- 启动第一个mitmproxy,命令如下:
mitmdump -s decrypt_forward.py --listen-port 8079
注意:访问端需要导入第一个mitmproxy的根证书并信任,否则无法正常完成HTTPS流量的MITM解密。
第二步:配置第二个mitmproxy(明文HTTP转HTTPS)
你已经准备了tls_passthrough相关脚本,只需要补全明文转HTTPS的逻辑即可,示例脚本reencrypt.py如下:
from mitmproxy import http def request(flow: http.HTTPFlow) -> None: # 把收到的明文HTTP请求改回HTTPS,发往目标服务器 if flow.request.scheme == "http": flow.request.scheme = "https"
启动第二个mitmproxy的命令参考:mitmdump -s reencrypt.py --listen-port 8081
注意:把中间普通HTTP代理的上游地址配置为第二个mitmproxy的监听地址(如示例中的127.0.0.1:8081)即可。
原配置失败原因说明
你之前使用--mode upstream参数不生效,是因为mitmproxy默认对HTTPS请求会先向上游代理发送CONNECT请求建立隧道,之后直接转发加密的TLS流量,不会做MITM解密,自然不会把HTTPS转为明文HTTP。上面的方案强制让第一个节点先完成TLS解密再转发,绕开了默认的CONNECT隧道逻辑。
内容的提问来源于stack exchange,提问作者sklott
相关产品推荐
相关产品推荐

