本帖最后由 jiaxin9873 于 2026-5-8 17:51 编辑
如果想在Android中抓HTTPS流量,通常使用burpsuit等代理和中间人攻击的方式,这时就需要安装自定义证书,让Android系统不再拦截无效证书
1 制作证书
从burpsuit导出DER证书
导出证书:在 Burp Suite 里,Proxy -> Options -> Import / export CA certificate -> Export -> Certificate in DER format,导出 cacert.der 文件。
2 将DER证书转换为PEM证书和改名
[Bash shell] 纯文本查看 复制代码 # 1. 把 DER 格式转成 PEM 格式
openssl x509 -inform DER -in cacert.der -out burp.pem
# 2. 计算证书的哈希值(这会是新证书的文件名)
openssl x509 -inform PEM -subject_hash_old -in burp.pem | head -1
# 3. 把 PEM 文件重命名为计算出来的哈希值,后缀是 .0
# 直接在资源管理器改名也行
# (比如计算出的哈希是 9a5ba575,就执行下面这行)
ren burp.pem 9a5ba575.0
3 模拟器打开root权限和文件读写
4 使用ADB安装证书
从 Android 14 开始,系统信任的 CA 证书存储路径已经从传统的 /system/etc/security/cacerts 迁移到了 APEX 模块(即只读分区)下的 /apex/com.android.conscrypt/cacerts。这就是为什么手动复制到旧的 /system 路径下会失效。
要解决这个问题,可以试试利用tmpfs内存文件系统
这是目前较推荐的方法,通过在内存中创建一个临时文件系统 (tmpfs) 并绑定挂载,绕过对只读分区的直接修改。成功后,证书会立即生效,无需重启模拟器,且重启后操作会失效。
详细的操作原理可以参考这些分享。具体操作步骤如下:
假设输出的哈希值为 9a5ba575。
[Bash shell] 纯文本查看 复制代码 # 查看设备名
adb devices
# emulator-5554修改为你看到的设备名
# 先将证书拷贝的tmp目录
adb -s emulator-5554 push 9a5ba575.0 /data/local/tmp/
# 连接模拟器并获取 Root 权限:
adb -s emulator-5554 root
adb -s emulator-5554 shell
su
注意:此操作临时且易失,模拟器重启后即失效。
在 Shell 中执行绑定挂载脚本:
[Bash shell] 纯文本查看 复制代码 #!/system/bin/sh
CERT_NAME="9a5ba575.0" # 记得修改成你的哈希值文件名
CERT_PATH="/data/local/tmp" # 假设你把证书放在了这里
# 1. 创建临时目录并复制原有证书
mkdir -p -m 700 /data/local/tmp/tmp-ca-copy
cp /apex/com.android.conscrypt/cacerts/* /data/local/tmp/tmp-ca-copy/
# 2. 创建 tmpfs 挂载点
mount -t tmpfs tmpfs /system/etc/security/cacerts
# 3. 将原有证书复制回 tmpfs
mv /data/local/tmp/tmp-ca-copy/* /system/etc/security/cacerts/
# 4. 将你的新证书复制进去
cp /data/local/tmp/$CERT_NAME /system/etc/security/cacerts/
# 5. 设置正确的权限和 SELinux 上下文
chown root:root /system/etc/security/cacerts/*
chmod 644 /system/etc/security/cacerts/*
chcon u:object_r:system_file:s0 /system/etc/security/cacerts/*
# 6. 将挂载绑定到新路径
mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
5 在模拟器中检查证书
设置->安全和隐私->更多安全和隐私设置->加密与凭据->可信凭据
看到PortSwigger表示成功
6 Burp suite已经可以正常抓包了
|