在安卓7.0+上用charles抓https

一提及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的方法:

  • 解锁手机 Bootloader
  • 刷入第三方 Recovery(例如 TWRP)
  • 下载官方 Magisk 包,而后经过第三方 Recovery 刷入
  • 下载AlwaysTrustUserCerts.zip (这是一个Magisk模块)
  • 经过Magisk安装上面这个模块
  • 正常途径安装好charles证书(这时候安装,charles证书还在用户证书下)
  • 重启
  • 你会发现charles证书已经自动变成了系统证书,完

4. 换iPhone

我说这是最省事的方式你应该没意见吧?

参考资料:

https://developer.android.com/training/articles/security-config

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/bypassing-androids-network-security-configuration/

https://blog.nviso.be/2017/12/22/intercepting-https-traffic-from-apps-on-android-7-using-magisk-burp/

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

https://www.imooc.com/article/49265

https://www.jianshu.com/p/310d930dd62f