Charles的HTTPS抓包方法及原理分析

摘要:
有多种数据包捕获工具,Charles和Fiddler更好。这里我们将简要介绍HTTPS的相关原理,并以Charles为例介绍如何捕获HTTPS协议包。因此,HTTPS协议原理的研究最终是SSL/TLS协议的研究。Charles Grapping HTTPS Packet Principle Charles是一个协议代理工具。如果只是一个普通的HTTP请求,因为数据本身没有被重新加密,作为代理,它可以知道客户端发送给服务器的所有请求的内容,以及服务器返回给客户端的数据的内容,这就是为什么包捕获工具可以直接显示数据传输的内容。

原文地址:http://www.jianshu.com/p/870451cb4eb0

背景

作为移动平台的RD,项目开发过程中一项比较重要的甩锅技能——抓包应该大家都比较熟悉了,毕竟有些bug可能是由服务端下发的数据出错导致的。虽然抓包工具很好用,但是如果不做一些设置的话,对于HTTPS协议的请求就无能为力了,比如这样

Charles的HTTPS抓包方法及原理分析第1张
 

这对于一些注重安全性的应用来说,或许就不是特别好使,我们的项目目前也在逐渐从HTTP转向HTTPS,因此掌握这些技巧还是比较有用的。抓包工具多种多样,比较好使的还是Charles和Fiddler,下面就简单的介绍下HTTPS的相关原理并以Charles为例来介绍下如何抓取HTTPS协议的包。

原理分析

其实使用工具抓HTTPS的包本身并不难,两三步简单的操作就可以实现,关键如果不理解原理的话,总觉得不舒服斯基,所以把原理分析放在前面。

HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。所以,研究HTTPS协议原理,最终就是研究SSL/TLS协议。

运行过程

我们都知道HTTPS在保证数据安全传输上使用了加密算法,但是具体是如何加密的,或许许多人和我一样也是云里雾里。
实际上SSL/TLS协议的基本思路是非对称加密和对称加密结合来传输数据,一言以弊之,HTTPS是通过一次非对称加密算法(如RSA算法)进行了协商密钥的生成与交换,然后在后续通信过程中就使用协商密钥进行对称加密通信,之所以要使用这两种加密方式的原因在于非对称加密计算量较大,如果一直使用非对称加密来传输数据的话,会影响效率。
运行过程盗用巨人的图,可以表示如下

Charles的HTTPS抓包方法及原理分析第2张
 

有了图就可以一步一步分析了

1.HTTPS请求

这个步骤是整个通信过程中的第一步,首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,在这一步中,客户端主要向服务器提供以下信息:

  • 支持的协议版本,比如TLS 1.0版
  • 一个客户端生成的随机数RandomC,稍后用于生成“协商密钥”
  • 支持的加密方法,比如RSA公钥加密。
  • 支持的压缩方法。

2.服务器响应

服务器收到客户端请求后,向客户端发出回应,服务器的回应一般包含以下内容:

  • 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
  • 一个服务器生成的随机数RandomS,稍后用于生成“协商密钥”*
  • 从客户端支持的加密方法中选择一个作为确认要使用的加密方法,比如RSA公钥加密。
  • 服务器证书。
    这个服务器证书就是表明服务器身份的东西,其中也包含了非对称加密中需要使用的公钥。

3.证书校验、生成密码、公钥加密

客户端收到服务器回应以后,首先验证服务器返回的证书。如果证书不是可信机构颁发,或者证书中的域名与实际域名不一致,或者证书已经过期,以浏览器为例客户端会向网页访问者显示一个警告,由其选择是否还要继续通信。 如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后生成密码、公钥加密。
生成密码的过程会先产生一个随机数Pre-master key,该随机数是整个握手阶段出现的第三个随机数,稍后会经过公钥加密发送到服务端,有了它以后,客户端和服务器就同时有了三个随机数——RandomC,RandomS,Pre-master key,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把“协商密钥”。

4.加密信息C-S

加密信息是指上面一步生成的内容,主要包括

  • 一个随机数Pre-master key。用于给服务端生成“协商密钥”。
  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项通常也是前面发送的所有内容的hash值,用来供服务器校验。

5.私钥解密、解密握手消息、验证Hash

服务器收到客户端公钥加密的第三个随机数Pre-master key之后,通过自身私钥解密该数值并由之前的RandomC和RandomS计算生成本次会话所用的“会话密钥”。然后,通过约定的Hash算法验证客户端发送的数据完整性。

6.加密信息S-C

主要是指

  • 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  • 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发生的所有内容的hash值,用来供客户端校验。

7.解密握手消息、验证Hash

客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。

8.正常加密通信

握手成功之后,所有的通信数据将由之前协商密钥及约定好的算法进行加密解密。

Charles抓HTTPS包原理

Charles本身是一个协议代理工具,如果只是普通的HTTP请求,因为数据本身没经过再次加密,因此作为代理可以知道所有客户端发送到服务端的请求内容以及服务端返回给客户端的数据内容,这也就是抓包工具能够将数据传输内容直接展现出来的原因。对于HTTPS请求,4,6,8步骤的数据都已经经过了加密,代理如果什么都不做的话是无法获取到其中的内容的。为了实现这个过程的数据获取,Charles需要做的事情是对客户端伪装服务端,对服务端伪装客户端,具体

  • 截获真实客户端的HTTPS请求,伪装客户端向真实服务端发送HTTPS请求
  • 接受真实服务器响应,用Charles自己的证书伪装服务端向真实客户端发送数据内容

一般情况下HTTPS中是客户端对服务端做证书校验,当然也有一些金融机构会有用户证书作为提供给服务端做用户认证的工具,保证发出请求的的确是这部分授权用户。我们仅分析客户端对服务单做证书校验的这种。Android有自己的一套HTTPS通信调用方式,以HttpsURLConnection为例

Charles的HTTPS抓包方法及原理分析第3张
 

上面这段代码就是一个https请求的样例,这种方法的特点是证书校验工作交由系统处理,系统只会允许可信CA签发的数字证书能够访问,私有CA签发的数字证书(比如12306以及我们上文说的Charles证书)是无法访问的。
那么如何绕过呢,

  • 第一种方法是修改Https通信代码,这种只对开发者开发应用的时候好使,我们需要实现X509TrustManager接口去做自己的一套证书校验,它并不通用,尤其是对于我们抓包而言是不可行的,因为我们没法去修改别人应用中的代码。
  • 第二种方法是将私有CA签发的数字证书安装到手机中并且作为受信任证书保存,这种方式是我们推荐的方式,唯一的缺点是你的手机上可能会在通知栏一直留着一个特殊标志,告诉你网络可能被监控。恩,不监控我们怎么抓包呢,哈哈。
Charles抓包步骤

原理都说完了,下面就是贴图时间,我们要做的最重要的其实只有一件事情,就是

将私有CA签发的数字证书安装到手机中并且作为受信任证书保存

一步一步来

  • 首先打开Charles菜单,选择安装Charles证书到移动设备
Charles的HTTPS抓包方法及原理分析第4张
 
  • Charles提示你如何安装,这里如何用手机连接Charles就不做叙述了,普通的HTTP抓包都需要执行
Charles的HTTPS抓包方法及原理分析第5张
 
Charles的HTTPS抓包方法及原理分析第7张
 
Charles的HTTPS抓包方法及原理分析第8张


作者:silentleaf
链接:http://www.jianshu.com/p/870451cb4eb0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

免责声明:文章转载自《Charles的HTTPS抓包方法及原理分析》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇一个数与0进行按位或,能取整pod 私有 pod 库创建和使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

windows环境下的Anaconda安装与OpenCV机器视觉环境搭建

https://blog.csdn.net/iracer/article/details/80498732 本文介绍win7和win10系统下通过Anaconda配置基于python语言的机器视觉编程环境(博主测试了两个系统下的安装基本相同),主要内容包括: Anaconda下载安装OpenCV下载安装测试安装结果本文安装的版本为:Anaconda4.2+...

erlang局域网内节点通信——艰难四步曲

http://blog.chinaunix.net/uid-22566367-id-382011.html 在Programming Erlang这本书中,在写到第十章中,主要实现的是不同节点之间的通信,书上列出了四步,其中的第一步很容易实现,依葫芦画瓢,很容易实现同一台机子上,不同节点之间的通信,运行结果和书上的完全一致。当你急切地去尝试第二步(在局域网...

docker上安装配置宝塔面板

docker上安装配置宝塔面板 参考资料 | 掘金 目录 docker上安装配置宝塔面板 为什么使用 Docker 安装? 宝塔面板介绍 安装docker 开启端口号 安装宝塔镜像 登录方式 宝塔面板命令行 进阶配置 备份宝塔面板容器 其他问题 为什么使用 Docker 安装? 环境隔离,一个主机可以部署多套服务 宝塔对主机控制度较高,依...

jenkins入门-----(1)安装、配置

Jenkins概念 Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。官网:https://jenkins.io/ 官方文档:https://jenkins.io/doc/ Jenkins特性 开源的java语言开...

WireShark抓包分析(二)

简述:本文介绍了抓包数据含义,有TCP报文、Http报文、DNS报文。如有错误,欢迎指正。 1、TCP报文 TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP 是面向连接的所以只能用于点对点的通讯)源IP地址:发送包的IP地址;目的IP地址:接收包的IP地址;源端口:源系统上的连接的端口;目的端口:目的系统上的连...

IPI 通信(SMP)【转】

转自:https://winddoing.github.io/post/60164.html IPI (Interrupt-Procecesorr Interrupt): 处理中间的中断 主要应用是一个处理器让另一个处理器做特定的事情(function 和 sched)   +--------------------------...