一说起charles抓https,大家可能要笑我了,这还用得着你教?证书往手机上一装不就行了?
然而事情并没有这么简单,很多时候你会发现,即使你配置正确,在手机上也装好了charles证书,仍然无法抓到https,如下图所示,这是为什么呢?
Charles提示Received fatal alert: certificate_unknown,你还以为是你证书没配正确,折腾半天也找不到正确姿势,其实这都是安卓系统搞的鬼。
话说回来,并不是安卓要搞鬼,而是安卓专门为了防抓包防监听而设置的新的安全策略,详情可以参见这里:https://developer.android.com/training/articles/security-config
简言之,7.0以前,安卓系统默认是选择信任系统证书及用户证书的,我们安装的charles证书就是用户证书,然而到了7.0以后,安卓决定默认不信任用户自己安装的证书了(可能Google觉得用户都是小白,瞎几把装证书,所以一刀切了),所以我们现在即使装了证书系统也不信任,自然也抓不到包了。
有什么办法解决呢?这才是这篇文章主要内容,我们分情况看下:
一、我是开发者,我要抓自己app的包
这种情况参考官方文档就行了,可以在app里配置信任用户证书,不多说
二、我想研究别人的app
这种就比较麻烦了,我整理了下资料,大致有以下一些方法来绕过安卓的限制:
1. 反编译
反编译后用官方的方法绕过,至于反编译的难度,这个不好说,有的app反破解做得好,会很难。方法还是说一下,使用apktool反编译应用程序,完成该过程后,在resources目录中建好网络安全配置文件,设置成信任用户证书。完成后,使用apktool重新编译应用程序,并使用Java JDK提供的jarsigner工具对生成的APK文件进行签名。
2. 运行时hook
利用动态二进制插桩技术,在程序运行时动态插入额外代码,改变安卓的网络安全配置行为。类似的hook软件比如frida,在参考资料中有其使用方法, 可以自行查阅
3. 把charles证书装成系统证书
这大概是最一劳永逸的方法了,你不是只信任系统证书,不信任用户证书吗?那我就把charles证书装成系统证书,就这么简单粗暴!然而虽然简单粗暴,但方法依然很复杂,你是不是以为root完,把证书往系统证书目录一拷贝就行了?行是行,但是不妥,因为系统证书在system目录,这表示你得将system目录设为可写的,但这个方法实在太粗暴了,以至于安卓的反root算法很容易就检测出来,然后你的手机从此以后就各种幺蛾子了,什么app启动不了啊七七八八的事。不过没关系,我这里还有一种不需要root的方法:
- 解锁手机 Bootloader
- 刷入第三方 Recovery(例如 TWRP)
- 下载官方 Magisk 包,然后通过第三方 Recovery 刷入
- 下载AlwaysTrustUserCerts.zip (这是一个Magisk模块)
- 通过Magisk安装上面这个模块
- 正常途径安装好charles证书(这时候安装,charles证书还在用户证书下)
- 重启
- 你会发现charles证书已经自动变成了系统证书,完
4. 换iPhone
我说这是最省事的方式你应该没意见吧?
参考资料:
https://developer.android.com/training/articles/security-config
https://github.com/NVISO-BE/MagiskTrustUserCerts
https://www.jianshu.com/p/393f5e51716e
http://www.oneplusbbs.com/thread-4077732-1-1.html
http://www.oneplusbbs.com/thread-3903166-1-1.html