使用Charles进行HTTPS抓包(包括安装信任证书以及抓包 出现无法抓包unknown和证书无效解决方案)

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

参考网址https://www.jianshu.com/p/7a88617ce80b

背景:

在进行App测试或定位线上问题时,经常会遇到抓取HTTPS数据包的需求。一般在windows上会使用fiddler,Mac上使用Charles。对于https请求,抓到的数据因为经过了加密,只能看到乱码。

本文介绍如何使用Charles来抓取https网络报文。操作步骤已在MAC + iphone5s上亲测。

操作原理

关键的操作思想:
1. 构造一个中间人代理,它有能力完成TLS/SSL握手
2. 弄到一个根证书,并用它生成签名认证的代理服务器证书

<p>  Charles就是一个理想的中间人,它支持SSL握手,可以自动根据根证书生成一个签名的服务器证书,并且它的官网为我们提供了一个根证书。(不安装也可抓到包只不过只能抓到http的包,不能抓https的包)
  我们要做的就是在客户端安装好这个根证书,然后让我们的操作系统信任它。对App来说,需要设法在IOS或Android上装上这个官网提供的根证书。
  完成上述步骤后,App再指定Charles为它的代理服务器,这时,App请求的服务器证书就是Charles自动生成的代理服务器证书。如果Charles的根证书已被信任,这个自动生成的代理服务器证书是有效的,使用它App和Charles的TLS握手可以顺利完成。</p>

以下是详细的操作步骤:

分步指南

第一步:配置HTTP代理,这步与抓取HTTP请求是一样的:

选择在8888端口上监听,然后确定。够选了SOCKS proxy,还能截获到浏览器的http访问请求。

第二步:配置SSL代理:

首先在charles的 Proxy选项选择SSL Proxy Settings

点add添加需要监视的域名,支持 *号通配符,端口一般都是443:

第三步 为手机设置代理

在手机无线中配置手动代理,输入安装Charles的电脑的网络地址,端口填8888。

第四步 安装根证书

在手机上安装Charles的根证书:

以IOS为例,在Safri上打开Charles的根证书下载网址: chls.pro/ssl 。
顺利的话会出现这样的画面,继续点安装,然后去设置里的描述文件管理中信任它就行了。

安卓安装,要分操作系统 chls.pro/ssl 。

会下载下来一个charles-proxy-ssl-proxying-certificate.pem证书

有的手机需要将后缀改为’.crt’,有的可直接使用,以小米为例(可直接使用)

  • 设置 > 更多设置(系统和设备) > 系统安全 > 从存储设备安装>找到相应的文件夹下的文件>点击安装
  • 第一次安装需要命名

在代理开启的情况下登录

如果不能下载,检查手机是否正确设置了代理,Charles是否已经打开并配置正确。

电脑端的根证书安装

以MAC为例,直接在Charles的Help菜单中安装;安装完成后去系统的钥匙串访问中信任它。

这里写图片描述

3.设置访问域名和端口 

这里写图片描述

ps:大部分人会设置Host:* port:443 ;但是如果直接点击OK也是没有问题的

各种unknown

以上的步骤在随便一搜都可以找到的,但是,上面是针对ios和一部分android机子可行,android7.0的机子再去用charles抓包时候会出现一下情况: 

这里写图片描述

此时此刻,把目光转移到代码上来,不管你在charles怎么配置都是无济于事的

步骤如下:

1.在项目res目录下新增一个文件夹,命名xml,并且新建一个xml文件,可以命名为network_security_config.xml(其实。名字可以顺便命名,对应就行)

这里写图片描述

2.network_security_config.xml 里面添加内容:

<span style="color:#000000"><code class="language-xml"><span style="color:#006666"><?xml version="1.0" encoding="utf-8"?></span><span style="color:#006666"><<span style="color:#4f4f4f">network-security-config</span>></span>    <span style="color:#006666"><<span style="color:#4f4f4f">domain-config</span>></span>        <span style="color:#006666"><<span style="color:#4f4f4f">domain</span> <span style="color:#4f4f4f">includeSubdomains</span>=<span style="color:#009900">"true"</span>></span>请求域名<span style="color:#006666"></<span style="color:#4f4f4f">domain</span>></span>        <span style="color:#006666"><<span style="color:#4f4f4f">trust-anchors</span>></span>            <span style="color:#006666"><<span style="color:#4f4f4f">certificates</span> <span style="color:#4f4f4f">src</span>=<span style="color:#009900">"@raw/证书名称"</span>/></span>        <span style="color:#006666"></<span style="color:#4f4f4f">trust-anchors</span>></span>    <span style="color:#006666"></<span style="color:#4f4f4f">domain-config</span>></span><span style="color:#006666"></<span style="color:#4f4f4f">network-security-config</span>></span></code></span>

PS:请求域名 – 为你项目请求接口所用到的域名 
证书名称 – 为上面提到的第二点在charles里面点击”Save Charles Root Certificate..”(路径: Help – SSL Proxying -Save Charles Root Certificate.. )

3.把证书放进res/raw 目录下 ,如果没有此目录,需要新建

这里写图片描述

ps:此时文件名称应当和上面提到的network_security_config.xml 文件里面证书名称对应

这里写图片描述

4.在AndroidManifest.xml文件需要加入以下配置: 

<span style="color:#000000"><code class="language-xml">android:networkSecurityConfig="@xml/network_security_config"</code></span>

大功告成,配置完成即可抓包。

完成后:试试看抓一下QQ空间的数据,将..qq.com 和*.qq.com 添加到SSL Proxy的Setting中后,配置好手机代理,打开手机QQ空间App
可以看到抓取到的报文如下:

图6

几点说明:

  1. 本文的操作指南是在MAC+iphone5s+Charles上实践的。文中开头已经讲述了HTTPS使用中间人代理抓包的简单原理和核心操作思想,其他环境下可以类比。
  2. 有些人认为https可以完美防止中间人攻击,无法抓到https的明文包…… 其实是不对的,TLS的设计只能说是从技术上最大限度地保护网络报文的安全,它无法防止用户自己作死。
  3. 网络安全和用户的安全意识是强相关的,技术的防范能力总是有限的。在实际生活中养成良好的上网习惯,千万不能随意信任不明来源的证书,轻视浏览器、操作系统或其他App给我们发出的安全警告。

charles之map功能

map remote设置

点这里可以跳转到人工智能网站

发表评论