环境准备:操作系统选择与基础工具链
搞 MITM 解密代理,第一步就是搭环境。这步看起来简单,但坑不少。我见过太多人在这上面折腾一整天,最后发现是选错了操作系统版本,或者 Python 环境没配好。
今天就聊聊怎么把底子打牢。我的习惯是:先在虚拟机里试,确认没问题再上物理机。你想想,要是生产环境出了问题,排查起来多麻烦。
操作系统怎么选?Linux 还是 Windows?
说实话,两个都能用。但我会优先推荐 Linux,特别是 Ubuntu 22.04 LTS 或 Debian 12。为什么?
- 包管理方便:apt install 一条命令搞定依赖,不用满世界找 DLL
- 网络栈透明:iptables、nftables 能精确控制流量,Windows 的 WFP 驱动层改起来太痛苦
- 稳定性好:我曾经在 Windows 上跑了 3 天,代理莫名其妙崩溃了,换到 Linux 后一个月没重启过
但如果你平时主力机就是 Windows,也不是不能做。我建议这么搞:
| 使用场景 | 推荐方案 | 个人建议 |
|---|---|---|
| 纯学习、实验 | Windows + WSL2 (Ubuntu 22.04) | 我刚开始也用这个方案,上手快 |
| 轻度生产或长时间运行 | Linux 物理机或虚拟专用服务器 | 稳定压倒一切 |
| 跨平台开发测试 | 双系统或 Docker 容器 | Docker 里的网络配置要额外注意 |
Python 环境准备
MITM 解密代理的核心工具基本都用 Python 写的。所以 Python 环境必须干净、靠谱。
- Python 版本:3.8 到 3.11 都行,我个人偏好 3.10。3.12 刚出时我尝鲜试过,结果 mitmproxy 有个依赖不兼容,折腾了半小时
- 虚拟环境:这是铁律。千万不要全局装,会炸。我习惯用
venv,轻量且够用 - pip 源:国内用户记得换清华或阿里源,不然下个几十 MB 的包能急死人
下面是我的标准操作流程,你可以直接复制用:
# 1. 安装 Python 3.10(如果没装)
sudo apt update
sudo apt install python3.10 python3.10-venv python3.10-dev -y
# 2. 创建虚拟环境
python3.10 -m venv mitm-env
# 3. 激活环境
source mitm-env/bin/activate
# 4. 升级 pip 和 setuptools
pip install --upgrade pip setuptools wheel
# 5. 换源(国内用户推荐)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 6. 安装核心依赖
pip install mitmproxy==10.1.1 cryptography pyOpenSSL
~/.bashrc 里加一行别名 alias mitmenv='source ~/mitm-env/bin/activate',省得老敲长命令。
为什么一定要用虚拟环境?
说白了,就是防冲突。你机器上可能装了别的 Python 项目,比如 Flask、Django,它们依赖的版本和 mitmproxy 不一样,一旦全局混装,跑着跑着就会报 ModuleNotFoundError。
我记得有一次,帮同事排查问题,他全局装了 mitmproxy,又装了个爬虫框架,结果两个项目依赖的 cryptography 版本冲突,代理直接崩了。用了虚拟环境后,世界清净了。
OpenSSL 配置
MITM 解密代理的核心是 TLS 中间人。这离不开 OpenSSL。你不需要成为 OpenSSL 专家,但必须知道怎么用它生成自签名证书、怎么把证书安装到目标设备上。
检查现有版本:
openssl version
# 输出示例:OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)
建议用 1.1.1 或 3.x 版本。太旧的版本(比如 1.0.2)不支持 TLS 1.3,现在很多网站已经开始强制要求了。
生成 CA 证书(这是最关键的一步):
# 生成 CA 私钥
openssl genrsa -out mitm-ca-key.pem 2048
# 生成 CA 证书(有效期设长一点,比如 10 年)
openssl req -x509 -new -nodes \
-key mitm-ca-key.pem \
-sha256 -days 3650 \
-out mitm-ca-cert.pem \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MITM Proxy/CN=MITM Root CA"
# 以后你抓包时,代理会用这个 CA 实时签发站点证书
# 目标浏览器或设备只需要信任 mitm-ca-cert.pem 就行
检查 OpenSSL 配置是否正确:
# 查看 OpenSSL 配置文件路径
openssl version -d
# 输出示例:OPENSSLDIR: "/usr/lib/ssl"
# 检查配置文件是否存在
cat /usr/lib/ssl/openssl.cnf | head -20
# 确保有一行:req_extensions = v3_req
# 这样生成的证书才会包含 SAN(主题备用名称),否则现代浏览器会报错
我踩过这个坑。曾经我生成证书时没注意 SAN 字段,结果 Chrome 一直提示“不是安全连接”,排查了半小时才发现是这个问题。
如果你的配置文件里没有 req_extensions,手动加一下:
# 编辑 openssl.cnf
sudo nano /usr/lib/ssl/openssl.cnf
# 在 [req] 部分添加:
req_extensions = v3_req
# 在文件末尾添加:
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost
DNS.2 = *.local
IP.1 = 127.0.0.1
IP.2 = 192.168.1.1 # 根据你的局域网 IP 修改
验证环境是否就绪
所有东西配好后,跑一条快速命令确认一下:
# 确保 Python 和 mitmproxy 能正常调用
python --version
mitmproxy --version
# 确保 OpenSSL 能正确读取配置
openssl version -a
# 试试用刚生成的 CA 签一个假证书
openssl req -new -nodes \
-out test.csr \
-newkey rsa:2048 \
-keyout test-key.pem \
-subj "/CN=test.local"
openssl x509 -req \
-in test.csr \
-CA mitm-ca-cert.pem \
-CAkey mitm-ca-key.pem \
-CAcreateserial \
-out test-cert.pem \
-days 365 \
-sha256
# 如果顺利,test-cert.pem 就生成了
# 你可以用 openssl x509 -in test-cert.pem -text -noout 查看内容
~/.mitmproxy 目录下,这样 mitmproxy 启动时会自动加载它,省得每次手动指定路径。
环境准备的核心逻辑视图
下面这张图概括了整个环境搭建的依赖关系,看一眼就能明白:
嗯,到这里环境就搭完了。接下来,你打开终端,激活虚拟环境,直接敲 mitmproxy 或 mitmweb,就能看到代理启动了。注意,首次运行会帮你在 ~/.mitmproxy 下自动生成默认证书,但我还是建议用自己的 CA,这样更好管理。