1. 为什么安卓高版本无法直接安装抓包证书?
很多开发者第一次在安卓7.0及以上系统抓包时都会遇到一个头疼的问题:明明已经在手机上安装了Fiddler或Charles的证书,但抓包工具就是无法识别HTTPS流量。这其实是谷歌从安卓7.0开始引入的新安全机制——系统默认不再信任用户安装的证书,只认系统预置的根证书。
我刚开始做移动安全测试时,花了整整两天才搞明白这个机制。简单来说,安卓把证书分成了两类:
- 用户证书:通过浏览器或文件管理器安装的证书
- 系统证书:存放在/system/etc/security/cacerts目录下的证书
高版本安卓的HTTPS栈会主动忽略用户证书,这就是为什么我们需要把抓包工具的证书"伪装"成系统证书。雷电模拟器作为最流行的安卓模拟器之一,给我们提供了ADB root权限这个"后门",让我们能够完成这个操作。
2. 准备工作:工具与环境配置
2.1 必备工具清单
在开始之前,请确保准备好以下工具:
- 雷电模拟器:建议使用4.0以上版本
- OpenSSL:用于证书格式转换(推荐1.1.1版本)
- Fiddler/Charles:根据你使用的抓包工具二选一
- ADB工具:通常包含在Android SDK中
2.2 OpenSSL安装详解
很多教程只简单说"安装OpenSSL",但实际安装时有几个坑需要注意:
- 到Shining Light Productions官网下载Win32/Win64 OpenSSL安装包时,一定要选择带"Light"的版本(如"Win64 OpenSSL v1.1.1w Light")
- 安装时记得勾选"Copy OpenSSL DLLs to"下的"The OpenSSL binaries (/bin) directory"
- 环境变量配置后,一定要重启CMD窗口才能生效
验证安装是否成功:
openssl version如果看到版本号输出,说明安装正确。
3. Fiddler证书处理全流程
3.1 证书导出操作
在Fiddler中导出证书时有个小技巧:点击菜单栏的"Tools > Options > HTTPS",在打开的窗口中点击"Actions > Export Root Certificate to Desktop"。这样导出的证书会自动放在桌面,方便后续操作。
3.2 证书格式转换实战
转换命令看起来简单,但有几个参数很容易出错:
openssl x509 -in FiddlerRoot.cer -inform DER -out FiddlerRoot.pem -outform PEM-inform DER:指定输入格式为DER(Fiddler默认导出格式)-outform PEM:指定输出为PEM格式- 路径最好用全英文,避免中文目录导致的奇怪问题
3.3 哈希值计算与重命名
计算哈希值时,新手常犯的错误是:
openssl x509 -subject_hash_old -in FiddlerRoot.pem这个命令必须在证书所在目录执行,否则会提示"无法打开文件"。得到哈希值后(如269953fb),重命名文件时要特别注意:
- 文件名格式必须为
<哈希值>.0 - 扩展名
.0不能省略 - 不要有任何多余字符
4. Charles证书处理要点
4.1 Charles证书的特殊性
Charles的证书导出路径比较隐蔽:
- 点击菜单"Help > SSL Proxying"
- 选择"Save Charles Root Certificate"
- 保存类型选择"PEM格式"
4.2 哈希计算差异
Charles的PEM证书可以直接计算哈希值:
openssl x509 -subject_hash_old -in charles.pem得到的哈希值(如e3ab5537)同样需要用于重命名文件。这里有个经验:Charles的证书哈希值通常以e开头,而Fiddler的以2开头,这个特征可以帮助你快速区分两个证书。
5. 雷电模拟器证书部署详解
5.1 ADB连接技巧
雷电模拟器的ADB端口默认是5555,但有时会遇到冲突。如果连接失败,可以尝试:
- 关闭模拟器
- 删除用户数据重新启动
- 在设置中查看当前ADB端口
连接命令示例:
adb connect 127.0.0.1:5555 adb remountremount命令非常重要,它能让/system目录可写。
5.2 证书推送的注意事项
推送证书时最容易遇到权限问题:
adb push 269953fb.0 /system/etc/security/cacerts adb push e3ab5537.0 /system/etc/security/cacerts完成后务必检查文件权限是否为644(-rw-r--r--),可以使用:
adb shell ls -l /system/etc/security/cacerts如果权限不对,需要执行:
adb shell chmod 644 /system/etc/security/cacerts/269953fb.05.3 验证证书是否生效
在模拟器的"设置 > 安全 > 受信任的证书 > 系统"中,应该能看到新添加的证书。但更可靠的验证方法是:
- 启动抓包工具
- 在模拟器中访问https网站
- 查看抓包工具是否能解密HTTPS流量
如果还是不行,可以尝试重启模拟器。我在实际测试中发现,有时候证书需要等几分钟才能被系统加载。
6. 常见问题排查指南
6.1 证书不生效的可能原因
根据我的踩坑经验,90%的问题出在以下几个方面:
- 文件名格式错误(缺少.0扩展名或哈希值不对)
- 文件权限不正确(不是644)
- /system分区没有成功remount
- 证书没有放在正确的目录下
6.2 高级调试技巧
当常规方法都失效时,可以尝试:
adb shell stop adb shell start这会重启安卓的system_server进程,强制重新加载证书。
另一个有用的命令是检查系统是否真的加载了你的证书:
adb shell logcat | grep -i cert7. 安全注意事项与最佳实践
虽然这个方法很实用,但要注意:
- 测试完成后建议删除添加的证书
- 不要在生产环境中使用这种方法
- 雷电模拟器的root权限可能带来其他安全风险
对于需要频繁切换证书的开发者,可以写个简单的批处理脚本来自动化整个过程。我常用的脚本会包含以下功能:
- 自动转换证书格式
- 计算哈希值并重命名
- 通过ADB推送证书
- 自动设置正确权限