You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android7.0上安装支持TLS 1.3的mitmproxy?

解决方案:Android 7.0 部署支持 TLS 1.3 的 mitmproxy 并实现数据转发

一、核心限制突破:Android 7.0 上的 TLS 1.3 支持

Android 7.0(API 24)原生依赖 OpenSSL 1.0.1,不支持 TLS 1.3。要让 mitmproxy 启用 TLS 1.3,必须为其提供 OpenSSL 1.1.1+ 的运行环境。

1. 编译适配 Android 的 OpenSSL 1.1.1

  • 准备 Android NDK(推荐 r21e,适配 Android 7.0 各 ABI)
  • 下载 OpenSSL 1.1.1 源码,编译对应设备的架构(arm64-v8a/armeabi-v7a):
    # 设置 NDK 环境变量
    export ANDROID_NDK=/path/to/android-ndk-r21e
    # 编译 arm64-v8a 版本
    ./Configure android-arm64 -D__ANDROID_API__=24 --prefix=/path/to/output/arm64-v8a
    make -j$(nproc)
    make install
    
  • 将编译生成的 libcrypto.so、libssl.so 推送到 Android 设备的 /data/local/tmp/openssl/lib 目录

二、在 Android 7.0 上安装 mitmproxy

mitmproxy 依赖 Python 3.6+,Android 原生无 Python 环境,需先部署适配版本:

1. 安装兼容 Android 7.0 的 Termux

  • 下载 Termux 旧版本(如 0.118.0,新版本可能放弃对 Android 7.0 的支持)
  • 打开 Termux,安装基础依赖:
    pkg update && pkg install python3 openssl-dev libffi-dev
    
  • 替换 Termux 自带的 OpenSSL 为编译好的 1.1.1 版本:
    # 备份原有库
    mv $PREFIX/lib/libcrypto.so $PREFIX/lib/libcrypto.so.bak
    mv $PREFIX/lib/libssl.so $PREFIX/lib/libssl.so.bak
    # 复制编译生成的库到 Termux 目录
    cp /data/local/tmp/openssl/lib/libcrypto.so $PREFIX/lib/
    cp /data/local/tmp/openssl/lib/libssl.so $PREFIX/lib/
    

2. 安装 mitmproxy

  • 指定 OpenSSL 路径,安装兼容版本(推荐 8.1.1,后续版本可能依赖更高 Python 版本):
    export LD_LIBRARY_PATH=$PREFIX/lib:$LD_LIBRARY_PATH
    pip3 install mitmproxy==8.1.1
    
  • 验证 TLS 1.3 支持:启动 mitmproxy 后执行 mitmproxy --version,确认输出包含 TLS 1.3

三、配置 mitmproxy 实现数据转发到远程数据库

通过 mitmproxy 脚本扩展,捕获数据包后自动写入远程数据库:

1. 编写 Python 脚本(示例:db_upload.py)

import psycopg2  # 以 PostgreSQL 为例,其他数据库替换对应驱动(如 pymysql)
from mitmproxy import http

class DBUploader:
    def __init__(self):
        # 初始化数据库连接
        self.conn = psycopg2.connect(
            host="your-db-host",
            database="your-db-name",
            user="your-db-user",
            password="your-db-password"
        )
        self.cur = self.conn.cursor()

    def request(self, flow: http.HTTPFlow) -> None:
        # 捕获请求数据插入数据库
        try:
            self.cur.execute(
                "INSERT INTO requests (url, method, headers, body) VALUES (%s, %s, %s, %s)",
                (flow.request.pretty_url, flow.request.method, str(flow.request.headers), flow.request.content.decode('utf-8', errors='ignore'))
            )
            self.conn.commit()
        except Exception as e:
            print(f"请求插入失败: {e}")
            self.conn.rollback()

    def response(self, flow: http.HTTPFlow) -> None:
        # 捕获响应数据插入数据库
        try:
            self.cur.execute(
                "INSERT INTO responses (url, status, headers, body) VALUES (%s, %s, %s, %s)",
                (flow.request.pretty_url, flow.response.status_code, str(flow.response.headers), flow.response.content.decode('utf-8', errors='ignore'))
            )
            self.conn.commit()
        except Exception as e:
            print(f"响应插入失败: {e}")
            self.conn.rollback()

addons = [DBUploader()]

2. 启动 mitmproxy 并加载脚本

mitmproxy -s db_upload.py --set ssl_version_client=TLS13 --set ssl_version_server=TLS13
  • ssl_version_client/ssl_version_server 参数强制 mitmproxy 使用 TLS 1.3 完成客户端与服务端的握手

四、Android 设备抓包配置

  1. 设置 WLAN 代理:将代理地址设为 localhost:8080(mitmproxy 默认端口)
  2. 安装并信任 mitmproxy 证书:访问 mitm.it 下载对应 Android 证书,在系统设置中开启证书信任(需允许安装未知来源应用)

五、关键注意事项

  • Android 7.0 部分应用可能使用独立 SSL 栈(如 OkHttp 自带版本),需确保应用未绕过系统代理或强制指定旧 TLS 版本
  • 若遇端口占用或权限问题,可通过 su 切换 root 用户运行 mitmproxy
  • 确保 Android 设备能访问远程数据库,可通过 VPN 或开放数据库端口(需做好安全防护)

内容的提问来源于stack exchange,提问作者pangjiale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 21:01:35