一提及charles抓https,你们可能要笑我了,这还用得着你教?证书往手机上一装不就好了?html
然而事情并无这么简单,不少时候你会发现,即便你配置正确,在手机上也装好了charles证书,仍然没法抓到https,以下图所示,这是为何呢?android
Charles提示Received fatal alert: certificate_unknown,你还觉得是你证书没配正确,折腾半天也找不到正确姿式,其实这都是安卓系统搞的鬼。git
话说回来,并非安卓要搞鬼,而是安卓专门为了防抓包防监听而设置的新的安全策略,详情能够参见这里:https://developer.android.com/training/articles/security-configgithub
简言之,7.0之前,安卓系统默认是选择信任系统证书及用户证书的,咱们安装的charles证书就是用户证书,然而到了7.0之后,安卓决定默认不信任用户本身安装的证书了(可能Google以为用户都是小白,瞎几把装证书,因此一刀切了),因此咱们如今即便装了证书系统也不信任,天然也抓不到包了。算法
有什么办法解决呢?这才是这篇文章主要内容,咱们分状况看下:安全
1、我是开发者,我要抓本身app的包网络
这种状况参考官方文档就好了,能够在app里配置信任用户证书,很少说app
2、我想研究别人的app工具
这种就比较麻烦了,我整理了下资料,大体有如下一些方法来绕过安卓的限制:htm
1. 反编译
反编译后用官方的方法绕过,至于反编译的难度,这个很差说,有的app反破解作得好,会很难。方法仍是说一下,使用apktool反编译应用程序,完成该过程后,在resources目录中建好网络安全配置文件,设置成信任用户证书。完成后,使用apktool从新编译应用程序,并使用Java JDK提供的jarsigner工具对生成的APK文件进行签名。
2. 运行时hook
利用动态二进制插桩技术,在程序运行时动态插入额外代码,改变安卓的网络安全配置行为。相似的hook软件好比frida,在参考资料中有其使用方法, 能够自行查阅
3. 把charles证书装成系统证书
这大概是最一劳永逸的方法了,你不是只信任系统证书,不信任用户证书吗?那我就把charles证书装成系统证书,就这么简单粗暴!然而虽然简单粗暴,但方法依然很复杂,你是否是觉得root完,把证书往系统证书目录一拷贝就好了?行是行,可是不妥,由于系统证书在system目录,这表示你得将system目录设为可写的,但这个方法实在太粗暴了,以致于安卓的反root算法很容易就检测出来,而后你的手机今后之后就各类幺蛾子了,什么app启动不了啊七七八八的事。不过不要紧,我这里还有一种不须要root的方法:
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