近期,使用Fiddler调试Android应用,以下记录一下遇到的问题
将中间人证书安装为系统证书
根据 Android 7 行为更变 的说明
默认情况下,面向 Android 7.0 的应用仅信任系统提供的证书,且不再信任用户添加的证书颁发机构 (CA)。
因此,需要将整数安装为系统证书才可以进行抓包https。
-
准备:Android已获得Root权限 或 使用TWPR类第三方Recovery
-
将
/system
挂载为可读写
# 转换Fiddler导出的证书(DER编码)为PEM编码
openssl x509 -inform DER -in FiddlerRoot.cer -out cacert.pem
# 计算证书的MD5 Hash
$CERT_HASH=openssl x509 -inform PEM -subject_hash_old -in cacert.pem -noout
# 证书写入到System分区
# 如果已存在同名文件,将 .0 改为 .1 依次类推
adb push cacert.pem "/system/etc/security/cacerts/$CERT_HASH.0"
- 重启Android即可
Android 模拟器System分区不可写的问题
使用AVD时出现 mount: 'system' not in /proc/mounts
或者 '/dev/block/dm-4' is read-only
等的问题,无法将 /system 分区挂载为可读写
- 系统镜像选择使用
Google Apis
版本;Google Play
版本为 User Mode,没有Root权限
# 向Emulator启动命令中添加 -writable-system
emulator -avd Pixel_3a_API_30 -no-snapstorage -writable-system
adb root
# adb 取消启动验证
adb shell avbctl disable-verification
adb disable-verity
adb reboot
adb root
adb remount # 此时可挂载为可读写
# Do Something ...
adb shell mount -o ro,remount /system
Fiddler默认签发的证书有效期过长的问题
Beginning with Chrome 85, TLS server certificates issued on or after 2020-09-01 00:00:00 UTC will be required to have a validity period of 398 days or less.
在新版本的 Chrome / Android Webwiew,默认拒绝有效期超过398天的证书
然而Fiddler默认签发的证书有效期长达5年,因此需要修改其证书签发参数
- QuickExec 打开 about:config
- 添加
fiddler.certmaker.GraceDays
有效期从N天前开始 - 添加
fiddler.certmaker.ValidDays
有效期至N天之后
或者 直接在QuickExec中执行
prefs set fiddler.certmaker.GraceDays -5
prefs set fiddler.certmaker.ValidDays -360