mitmproxy简介与使用说明
一、mitmproxy概述
mitmproxy是一款免费且开源的交互式代理工具,功能强大,支持HTTP、HTTPS、HTTP2、WebSockets以及TCP数据的拦截、查看、修改和重放操作。它提供了命令行(mitmproxy)、基于浏览器的图形界面(mitmweb)以及可用于备份等功能的mitmdump工具,尤其以其灵活的Python脚本扩展能力备受开发者青睐,适用于开发、测试、安全研究等诸多场景。
二、安装mitmproxy
- 依赖环境准备
- mitmproxy基于Python开发,所以系统需预先安装Python环境。多数Linux发行版自带Python,也可通过官网(https://www.python.org/downloads/)下载安装合适版本(建议Python 3.6及以上)。
- 确保
pip
(Python包管理工具)已安装且为最新版本,可使用命令pip install --upgrade pip
更新。
- 安装mitmproxy
- 在Linux系统(以Ubuntu为例),打开终端,执行命令
sudo apt-get update
更新软件包列表后,输入sudo apt-get install mitmproxy
即可完成安装。 - 也可通过
pip
安装,执行pip install mitmproxy
,此方式适用于多种操作系统及Python环境。
- 在Linux系统(以Ubuntu为例),打开终端,执行命令
三、配置环境变量(使用apt install 则无需配置环境变量)
设置环境变量可方便在任意终端位置调用mitmproxy相关命令。
- Linux系统
- 编辑
~/.bashrc
文件(若是使用zsh
,则编辑~/.zshrc
文件),添加如下内容:
- 编辑
export PATH=$PATH:/usr/local/bin/mitmproxy # 根据mitmproxy实际安装路径调整
- 保存文件后,在终端执行
source ~/.bashrc
(zsh
为source ~/.zshrc
)使环境变量生效。
四、证书下载与安装
- 生成证书
- 首次运行mitmproxy(如执行
mitmproxy --version
命令),它会在~/.mitmproxy/
目录下自动生成CA证书,名为mitmproxy-ca-cert.pem
。 - 证书也可以通过启动mitm后访问 https://mitm.it/,下载证书
如果提示 “If you can see this, traffic is not passing through mitmproxy.” 说明本机的代理还没有配置,需要第3步完成。
- 首次运行mitmproxy(如执行
启动(以下3种都可以,根据需要)
mitmproxy -p 8888 (命令行模式,默认是8080)
mitmdump -p 8888 -w /tmp/dump.log (文件保存模式)
mitmweb -p 8888 (网页模式)
报错: /usr/bin/xdg-open: 882: w3m: not found
xdg-open: no method available for opening 'http://127.0.0.1:8081/'
解决: mitmweb需要浏览器支持,在浏览器支持模式下会打开 http://127.0.0.1:8081
- 安装证书到系统信任存储
- 在基于Debian或Ubuntu的Linux系统中,执行以下操作将证书添加到系统信任列表:
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy-ca-cert.crt
sudo update-ca-certificates
- linux环境下启用代理
export http_proxy="http://127.0.0.1:8888"
export https_proxys="http://127.0.0.1:8888"
五、Java安装证书
由于Java有独立的证书信任存储(不默认使用系统的证书,通常为$JAVA_HOME/jre/lib/security/cacerts
),需额外将mitmproxy的CA证书添加进去,以便Java应用能信任由mitmproxy签发的用于解密HTTPS流量的证书。
- 使用
keytool
命令(keytool
位于$JAVA_HOME/bin/
目录下),假设证书文件是mitmproxy-ca-cert.pem
,执行:
keytool -import -alias mitmproxy -file mitmproxy-ca-cert.pem -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
- 注意,这里
storepass
是证书存储的默认密码,Java默认通常为changeit
,执行过程中按提示确认添加操作。 - 在windows环境下是 %JAVA_HOME%
六、使用mitmproxy进行OkHttp代理访问
- 配置OkHttp客户端代码
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
public class Main {
public static void main(String[] args) {
// 设置代理,假设mitmproxy运行在本地(127.0.0.1)端口8888
Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 8888));
OkHttpClient client = new OkHttpClient.Builder()
.proxy(proxy)
.build();
Request request = new Request.Builder()
.url("https://example.com")
.build();
try {
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 因okhttp和httpclient 允许应用启用代理模式,因此,环境中的代理依然不被认可。
- 运行Java程序
- 编译并运行上述Java代码,此时Java应用通过OkHttp发送的请求就会经过mitmproxy代理,mitmproxy可拦截、查看和分析请求与响应数据,辅助开发调试、安全检测等工作。
- 注意,有可能有缓存,会发现启用了没生效,需要重启应用,防止因启动前访问过,增加session代理后出错,错误类似:not first session。
- 因会经过mitmproxy在中间代理人来一层,整个响应会变慢且是python,仅适合测试开发用。
通过以上步骤,即可完成mitmproxy的安装、配置以及结合Java的OkHttp实现代理访问,充分利用其强大功能助力网络请求相关工作。
mitmproxy 的Script
mitmproxy是使用python代码写的,也支持加载应用自己写的python脚本,执行url过滤,整理写入。以下是一个使用 mitmproxy 进行网络请求拦截的 Python 脚本示例,它可以实现对特定 URL 的请求进行拦截,并对请求和响应进行一些简单的处理和分析:
import mitmproxy.http
def request(flow: mitmproxy.http.HTTPFlow):
"""
处理请求的函数
在请求发送到服务器之前被调用
"""
# 检查请求的URL是否包含特定字符串,这里以"example.com"为例
if "example.com" in flow.request.url:
print(f"拦截到对 {flow.request.url} 的请求")
# 可以在这里对请求进行修改,比如修改请求头
flow.request.headers["User-Agent"] = "Modified User-Agent"
def response(flow: mitmproxy.http.HTTPFlow):
"""
处理响应的函数
在收到服务器响应之后被调用
"""
if "example.com" in flow.request.url:
print(f"收到来自 {flow.request.url} 的响应,状态码: {flow.response.status_code}")
# 可以在这里对响应进行查看或修改,比如查看响应内容
print(f"响应内容: {flow.response.text}")
mitmproxy -s intercept_script.py
这样就可以拦截一个 example.com的请求。
标签:http,证书,Python,flow,mitmproxy,import From: https://www.cnblogs.com/DennyZhao/p/18580340