环境准备:操作系统选择与基础工具链

搞 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 里的网络配置要额外注意
⚠️ 特别提醒:不要在 Windows 上直接跑 mitmproxy 做长连接代理。我遇到过 Windows 下 TCP 连接数高了之后,系统会莫名其妙丢包,排查了两天才找到原因。

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 就行
🔑 关键概念:你生成的 CA 证书就是你的“万能钥匙”。所有 HTTPS 流量都会被这个 CA 重签。一旦泄露,所有信任它的设备都会暴露在风险中。所以私钥一定要妥善保管。

检查 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 查看内容
💡 小技巧:我习惯把 CA 证书和私钥放到 ~/.mitmproxy 目录下,这样 mitmproxy 启动时会自动加载它,省得每次手动指定路径。

环境准备的核心逻辑视图

下面这张图概括了整个环境搭建的依赖关系,看一眼就能明白:

环境准备核心组件 操作系统 Python 3.8+ OpenSSL 1.1.1+ 网络工具 (iptables等) venv 虚拟环境 CA 证书与私钥 openssl.cnf 配置 mitmproxy cryptography库 抓包 / 解密 / 修改流量 环境准备决定后续开发效率。虚拟化隔离 + 正确证书配置是避坑的关键。

嗯,到这里环境就搭完了。接下来,你打开终端,激活虚拟环境,直接敲 mitmproxy 或 mitmweb,就能看到代理启动了。注意,首次运行会帮你在 ~/.mitmproxy 下自动生成默认证书,但我还是建议用自己的 CA,这样更好管理。