对于我们的 Android 模拟器自动化测试平台,我们能够使用经过尝试和测试的命令将 Proxyman 证书推送到
/system/etc/security/cacerts
:
使用
-writable-system
标志启动模拟器:emulator -avd emulator_name -writable-system
准备Proxyman证书:
openssl x509 -inform PEM -subject_hash_old -in proxyman-ssl-proxying-certificate.pem | head -1
- 它返回证书的哈希值,例如。 30eb732c
将其保存到文件中:
cat proxyman-ssl-proxying-certificate.pem > 30eb732c.0
openssl x509 -inform PEM -text -in proxyman-ssl-proxying-certificate.pem -out /dev/null >> 30eb732c.0
将创建的
30eb732c.0
推送到模拟器:
adb root
adb remount
adb root
adb shell avbctl disable-verification
adb reboot
adb root
adb remount
adb push 30eb732c.0 /system/etc/security/cacerts
我可以通过列出带有
adb shell ls /system/etc/security/cacert
的所有证书并在列表中看到我的证书来验证该文件是否存在。
有了这些,我们就可以在我们的应用程序的发布版本上看到 Proxyman 中的流量,最高可达 API 33,并且我可以在模拟器设置/安全/加密和凭据/受信任的凭据中看到安装在系统分区上的证书。
与Android模拟器UpsideDownCake相同的步骤,我可以看到证书文件确实在
/system/etc/security/cacert
中,但UI上没有显示它,并且Proxyman也无法捕获流量(得到SSL Handshake Failed
)。
安装cert的方法已经被告知很多了:
我觉得我可能在这里遗漏了一些东西,但也想知道 API 33 和 UpsideDownCake 模拟器之间有什么区别。有人在 Android 14 (UpsideDownCake) 模拟器上的
/system/etc/security/cacert
中成功安装了证书吗?
Android 14 首先查看此位置:
/apex/com.android.conscrypt/cacerts
Android 14 现在从 Conscrypt 库的 APEX 文件系统中读取 CA 证书,地址为
/apex/com.android.conscrypt/cacerts
。
对于这样的用例来说,这是一个尴尬的问题,因为该路径不可能直接修改或重新挂载。您可以尝试所有您喜欢的方法,但是 APEX 模块使用与文件系统其余部分不同的机制加载,一般来说,如果您通过 ADB shell 进行简单的更改,设备上的应用程序将看不到它们 - 它们使用隔离的安装命名空间,所以他们将继续独立使用原来的一套安装座。
我在这里做了一些挖掘,并找到了一些可行的解决方案:您可以将另一个目录绑定到此位置,然后使用
nsenter
将该安装单独复制到每个应用程序的安装命名空间中,并复制到 Zygote 进程中(它会启动未来的应用程序,以便新启动的应用程序默认复制它)。
这就是它的本质。完整的步骤和背景上下文非常复杂,但我已经记录了它并构建了一个完整的脚本来自动执行此操作:https://httptoolkit.com/blog/android-14-install-system-ca-certificate/
您可以在此处查看 HTTP Toolkit 中自动化该过程的结果更改:https://github.com/httptoolkit/httptoolkit-server/commit/965fd8d9b287af0e4b305d828d5e8e1aa52dce36