如何在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 设备抓包配置
- 设置 WLAN 代理:将代理地址设为
localhost:8080(mitmproxy 默认端口) - 安装并信任 mitmproxy 证书:访问
mitm.it下载对应 Android 证书,在系统设置中开启证书信任(需允许安装未知来源应用)
五、关键注意事项
- Android 7.0 部分应用可能使用独立 SSL 栈(如 OkHttp 自带版本),需确保应用未绕过系统代理或强制指定旧 TLS 版本
- 若遇端口占用或权限问题,可通过
su切换 root 用户运行 mitmproxy - 确保 Android 设备能访问远程数据库,可通过 VPN 或开放数据库端口(需做好安全防护)
内容的提问来源于stack exchange,提问作者pangjiale
相关产品推荐
相关产品推荐

