Charles + Android 抓取Https数据包 (适用于Android 6.0及如下)

经过Charles代理,咱们能很轻易的抓取手机的Http请求,由于Http属于明文传输,因此咱们能直接获取到咱们要抓取的内容。可是Https内容自己就是加密的,这时咱们会发现内容是加密的了。本文咱们来说述一下如何使用Charles抓取Https数据包及相关原理知识。html

1、Https客户端和服务器端通讯的基本流程

那么如何抓包呢,原理其实提及来也很简单,就是在客户端给服务器端发消息的时候,中间人(Charles)截取客户端发送给服务器的请求,而后假装成客户端与服务器进行通讯;将服务器返回给客户端的内容发送给客户端,假装成服务器与客户端进行通讯。

其实Charles就是这么作的,当配置了Charles以后,理论上全部的http/https请求数据都被拦截到了。看下面一张简化的中间人抓包的图:api

 

2、如何使用Charles抓取Android设备发送的Https数据请求

注:为了保证最简单的方式实现,下面的Android设备默认都是Android 6.0及如下。安全

保证Android手机和抓取https请求的电脑在同一网络下,而后就能够开始进行抓取操做了。抓取主要分为三步,分别以下:服务器

1.手机上导入Charles根证书

按照以下图所示操做便可:网络

 2.设置Android 手机代理

按照以下图的配置设置是最简单的:app

3.添加SSL代理设置

 

配置到此,咱们就能够正常抓取到Https明文数据了。dom

3、Android 7.0及以上为什么不能轻易抓取到Https请求的明文数据?

 1. 问题分析

其实Charles上显示确实抓到了包,可是当咱们看抓包的详细数据时会发现报错 You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu。Charles说手机端没有信任Charles的根证书,可是咱们手机上已经安装了Charles根证书了,为何会这样?编码

原来在Android 7.0(API 24 ) ,有一个名为“Network Security Configuration”的新安全功能。这个新功能的目标是容许开发人员在不修改应用程序代码的状况下自定义他们的网络安全设置。若是应用程序运行的系统版本高于或等于24,而且targetSdkVersion>=24,则只有系统(system)证书才会被信任。因此用户(user)导入的Charles根证书是不被信任的。加密

2. Android 7.0 (api 24 ) 和 targetSdkVersion 对抓包的影响

这里要分两种状况:spa

  1. 抓本身开发的app的网络包
  2. 抓第三方app的网络包,好比微博客户端

这两种状况有什么区别的,第一种app是咱们本身开发的,咱们手里有源码,可以修改,可以作到像官方文档里面说的同样进行配置。第二种咱们没有源码,要想作到像官方文档里面配置的话,只能反编译后,把配置文件添加进去而后从新打包,可是从新打包就会遇到不少坑,并不必定能成功,因此须要使用其余方式达到抓包目的。

引用官方文档一句话:默认状况下,来自全部应用的安全链接(使用 TLS 和 HTTPS 之类的协议)均信任预装的系统 CA,而面向 Android 6.0(API 级别 23)及更低版本的应用默认状况下还会信任用户添加的 CA 存储。应用可使用 base-config(应用范围的自定义)或 domain-config(按域自定义)自定义本身的链接。

 

参考内容附录:

1. Android 系统各个版本上https的抓包:https://www.jianshu.com/p/3b4cd6fdd8a9

2. Html标签清除:http://www.jiniannet.com/Page/clearhtml

3. Unicode编码转换:http://tool.chinaz.com/tools/unicode.aspx

相关文章
相关标签/搜索