随笔 - 231  文章 - 0 评论 - 0 阅读 - 88732
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

mitmproxy简介与使用说明

一、mitmproxy概述

mitmproxy是一款免费且开源的交互式代理工具,功能强大,支持HTTP、HTTPS、HTTP2、WebSockets以及TCP数据的拦截、查看、修改和重放操作。它提供了命令行(mitmproxy)、基于浏览器的图形界面(mitmweb)以及可用于备份等功能的mitmdump工具,尤其以其灵活的Python脚本扩展能力备受开发者青睐,适用于开发、测试、安全研究等诸多场景。

二、安装mitmproxy

  1. 依赖环境准备
  2. 安装mitmproxy
    • 在Linux系统(以Ubuntu为例),打开终端,执行命令sudo apt-get update更新软件包列表后,输入sudo apt-get install mitmproxy即可完成安装。
    • 也可通过pip安装,执行pip install mitmproxy,此方式适用于多种操作系统及Python环境。

三、配置环境变量(使用apt install 则无需配置环境变量)

设置环境变量可方便在任意终端位置调用mitmproxy相关命令。

  1. Linux系统
    • 编辑~/.bashrc文件(若是使用zsh,则编辑~/.zshrc文件),添加如下内容:
export PATH=$PATH:/usr/local/bin/mitmproxy  # 根据mitmproxy实际安装路径调整
  • 保存文件后,在终端执行source ~/.bashrczshsource ~/.zshrc)使环境变量生效。

四、证书下载与安装

  1. 生成证书
    • 首次运行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步完成。

启动(以下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

  1. 安装证书到系统信任存储
    • 在基于Debian或Ubuntu的Linux系统中,执行以下操作将证书添加到系统信任列表:
sudo cp ~/.mitmproxy/mitmproxy-ca-cert.pem /usr/local/share/ca-certificates/mitmproxy-ca-cert.crt
sudo update-ca-certificates
  1. 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流量的证书。

  1. 使用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代理访问

  1. 配置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();
        }
    }
}
  1. 因okhttp和httpclient 允许应用启用代理模式,因此,环境中的代理依然不被认可。
  2. 运行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的请求。

posted on   zhaoqiang1980  阅读(514)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示