wireshark && Fiddler抓包分析与解密https && Fiddler修改https请求和响应

Https理论

在说HTTPS之前先说说什么是HTTP,HTTP就是我们平时浏览网页时候使用的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。SSL目前的版本是3.0,被IETF(Internet Engineering Task Force)定义在RFC 6101中,之后IETF对SSL 3.0进行了升级,于是出现了TLS(Transport Layer Security) 1.0,定义在RFC 2246。实际上我们现在的HTTPS都是用的TLS协议,但是由于SSL出现的时间比较早,并且依旧被现在浏览器所支持,因此SSL依然是HTTPS的代名词,但无论是TLS还是SSL都是上个世纪的事情,SSL最后一个版本是3.0,今后TLS将会继承SSL优良血统继续为我们进行加密服务。目前TLS的版本是1.2。

Https的工作原理

HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议,更是一件经过艺术家精心设计的艺术品,TLS/SSL中使用了非对称加密,对称加密以及HASH算法

TCP、Https、SSL/TLS、https的关系

 

网络协议套件

上图截自维基百科,对协议进行了明确的划分。

  • TCP
    传输控制协议,属于传输层协议,提供可靠数据传输。它为http等应用层协议提供服务。

  • Http
    超文本传输协议,属于应用层协议。依赖于TCP协议。

  • SSL/TLS
    安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。位于某个可靠的传输协议(例如 TCP)上面,属于应用层协议。

  • Https
    在Http和TCP中间加入了SSL/TLS,保证数据传输的安全性

Https抓包演示

 

 

上面是我使用Avanced REST client请求我的https接口,整个请求是没问题的,后面我们就会抓下这个请求的包进行分析。
为了方便演示整个流程,我使用了自己的云服务器和已备案的域名,证书直接在阿里云上申请的免费证书。

环境配置

这里web服务器我们使用Nginx。
首先将阿里下发的证书放到nginx的conf下(新建一个cert文件夹)

 

nginx_cert.png

 

配置nginx

 

 

nginx_conf.png


当然我们的后台服务得启动起来。端口9000。这里我用的Springboot。

    @ApiOperation(value = "测试POST", notes = "测试POST")
    @RequestMapping(value = "post", method = RequestMethod.POST)
    public Result<TestEntity> testPost(@RequestBody TestBody testBody) throws Exception {
        Result<TestEntity> result = new Result<TestEntity>();
        TestEntity testEntity = new TestEntity();
        testEntity.setId(2);
        testEntity.setName(testBody.toString());
        result.setData(testEntity);
        return result;
    }

Https握手

我们将前面发起的请求进行抓包,这里使用wireshark。

 

 

抓包.png

这是一个完整的请求抓包。这样看,不是很清晰,我来画个图来表达下这个过程发生了什么。

 

请求流程

三次握手和四次挥手我们就不说了,这个才讲TCP的时候有详细介绍。
我们一步一步的看

第一步 Client Hello

先看一下抓出来包的内容,我们直接看到SSL层

 

 

client hello.png

 

这一步干啥了呢?

  1. TLS的版本
  2. 随机数:这个是用来生成最后加密密钥的影响因子之一,包含两部分:时间戳(4-Bytes)和随机数(28-Bytes)
  3. session-id:用来表明一次会话,第一次建立没有。如果以前建立过,可以直接带过去。后面的扩展内容会详细讲到。
  4. 加密算法套装列表:客户端支持的加密-签名算法的列表,让服务器去选择。
  5. 压缩算法:似乎一般都不用
  6. 扩展字段:比如密码交换算法的参数、请求主机的名字等等

这里要注意一个随机数,很重要。我们先记为Random1。

第二步 Server Hello

 

Server hello.png

  1. 据客户端支持的SSL/TLS协议版本,和自己的比较确定使用的SSL/TLS协议版本
  2. 确定加密套件,压缩算法
  3. 产生了一个随机数Random2。注意,至此客户端和服务端都拥有了两个随机数(Random1+ Random2),这两个随机数会在后续生成对称秘钥时用到

第三步 Server => Client

这次传输包含三部分内容

  • Certificate
  • Server Key Exchange
  • ServerHello Done

 

certificate_server_key.png

 

这里也是一个优化,三个部分一起发送。我们一个个分析

Certificate

这里主要就是把证书发送给Client。图中可以看到我的证书和证书发放机构。客户端拿到证书后就可以进行验证,同时获取到公钥,用于后面Random3的加密。

 

证书信息.png

 

证书一般采用X.509标准。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值