在Android上安装系统CA证书

从Android 7开始,除非将应用程序配置为使用用户证书,否则它们将忽略用户证书。由于大多数应用程序未明确选择使用用户证书,因此我们需要将mitmproxy CA证书放置在系统证书存储中,以避免不得不打补丁我们要监视的每个应用程序。

请注意,应用程序可以决定忽略系统证书存储,并维护自己的CA证书。在这种情况下,您必须修补该应用程序。

1.先决条件

  • 来自Android SDK的模拟器,代理设置指向mitmproxy
  • Mitmproxy CA证书
    • 通常位于~/.mitmproxy/mitmproxy-ca-cert.cer
    • 如果文件夹为空或不存在,请运行mitmproxy以生成证书

2.重命名证书

输入您的证书文件夹

cd ~/.mitmproxy/
  • Android中的CA证书以其哈希名称存储,扩展名为“ 0”
  • 现在生成证书的哈希值
    openssl x509 -inform PEM -subject_hash_old -in mitmproxy-ca-cert.cer | head -1

    假设输出为c8450d0d

现在我们可以复制mitmproxy-ca-cert.cerc8450d0d.0并且我们的系统证书可以使用了

cp mitmproxy-ca-cert.cer c8450d0d.0

3.将证书插入系统证书库

请注意,Android 9(API LEVEL 28)用于测试以下步骤,并且emulator可执行文件位于Android SDK中

  • 启动您的android模拟器。
    • 取得您的AVD清单 emulator -list-avds
    • 确保使用该-writable-system选项。否则将无法写入/system
    • 请记住,在不带-writable-systemoption的情况下启动时,仿真器将加载干净的系统映像。
    • 这意味着您必须始终使用-writable-system选项启动仿真器才能使用证书
emulator -avd <avd_name_here> -writable-system
  • 以root身份重新启动adb
adb root
  • 取得/system装置上的写入权限
  • 在早期版本(API LEVEL <28)Android中,您必须使用adb shell "mount -o rw,remount /system"
adb shell "mount -o rw,remount /"
  • 将您的证书推送到系统证书存储并设置文件权限
adb push c8450d0d.0 /system/etc/security/cacerts
adb shell "chmod 664 /system/etc/security/cacerts/c8450d0d.0"

4.重新启动设备并享受解密的TLS流量

  • 重新启动您的设备。
    • 您的CA证书现在应该是系统信任的
      adb reboot

      切记:您始终必须使用该-writable-system选项启动仿真器才能使用您的证书