Wireshark抓包图解HTTPS连接过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Wireshark抓包图解HTTPS连接过程相关的知识,希望对你有一定的参考价值。

参考技术A 图1.1是通过Wireshark抓到的HTTPS(TLS1.2)连接过程的数据包

数据包中的client端ip地址是192.168.1.51,是一部ios手机;server端ip地址是54.213.131.0,是AWS的某台服务器。

数据包主要分为三部分:

红色标记部分:TCP三次握手

绿色标记部分:TLS1.2握手交换密钥并确定加密方式

蓝色标记部分:HTTPS正式通信

Wireshark的抓包展示栏从左至右分别是: 消息ID(no.),消息时间戳(time),消息请求端ip地址(source),消息目标端ip地址(destination), 使用协议(protocol),消息长度(length),消息描述(info),下面会对数据包进行逐条解释

no.89 client向server发起的TCP连接请求的第一次握手,发送一个SYN包,Seq=0,TCP连接有两个基本要素:ip和port,443是HTTPS的端口号

no.91 server向client回复的TCP第二次握手,发送一个SYN包和ACK包,Seq=0, Ack=no.89的Seq+1, 所以Ack=0+1

no.92 client向server端发起的TCP第三次握手,发送一个ACK包,Ack=no.91的Seq+1,所以Ack=0+1

以上三个消息就完成了HTTPS中的TCP握手阶段,由此可以看出HTTPS是基于TCP的连接成功的。

HTTPS = HTTP + SSL,如果是HTTP协议,则没有SSL握手过程,直接进入第三步

no.93 client向server发起Hello消息,这里面主要包含五种信息(图2.1):

    1. client的TLS版本

    2. client支持的加密方式(图2.2)

    3. client支持的压缩方式

    4. 会话ID

    5. 客户端随机数 Random1

no.98 server向client回复一个Ack表示no.93的包已经收到,这个是基于TCP的确认收到。

no.99 server向client发送Hello消息, 这里面主要包含五种信息(图2.3)

    1. 采用TLS的版本

    2. 在no.93中client支持的加密方法列表选取的加密方式

    3. 在no.93中client支持的压缩方式列表选取的压缩方式

    4. 服务器的随机数 Random2

    5. 会话ID

no.102 server向client发出三个包(见图2.4):

    1.Certificate 服务器的公钥

    2.Server Key Exchange Server端计算加密的参数,如果是DH加密则需要这一步(见图2.5)

    3.Server Hello Done 握手结束事件

no.103-105 对TCP包的ACK

no.106 client向server发出三个包(见图2.6):

    1. Client Key Exchange   客户端验证no.102的公钥的合法性后,生成一个随机数 Random3, 通过公钥对Random3进行 非对称加密 发送给server端,server端通过私钥进行解密;至此client和server都存在Random1,2,3 三个变量,通过同一种加密算法计算出相同的加密密钥。

    2. Change Cipher Spec  client通知server进入对称加密模式

    3. Encrypted Handshake Message client将之前握手消息通过计算出的密钥加密发给server, 如果server能解析出来则说明密钥一致; 这是client第一条加密消息

no.109 server向client发送两个包(见图2.7)

    1. Change Cipher Spec server通知client进入对称加密模式

    2. Encrypted Handshake Message server将之前握手消息通过计算出的密钥加密发给client, 如果client能解析出来则说明密钥一致; 这是server第一条加密消息

直到no.109消息,整体HTTPS的连接过程已经结束,剩下为正式通信数据

最后,附上整个的HTTPS连接过程的时序图(图3.1)

大白话系列图解TCP三次握手使用wireshark工具抓包分析TCP三次交互流程

🎃个人介绍
🎈简介:一枚双非本科科班在读的学生,普普通通的生活却夹杂着不该有的梦想;一起学习交流WX:kht808
🎈博客主页:https://blog.csdn.net/Kevinnsm?spm=1001.2101.3001.5343
🎈热爱:广泛涉猎C/C++、JAVA、Python、Go,专注于服务端技术


1.首先准备好抓包工具wireshark

w i r e w h a r k 官 网 下 载 地 址 : wirewhark官网下载地址: wirewharkhttps://www.wireshark.org/


2.准备一段简单的socket程序

🏆(1)服务端程序如下

    public void server06() throws IOException 
        try 
            serverSocket = new ServerSocket(8080);
            serverSocket.accept();
            Thread.sleep(Integer.MAX_VALUE);
         catch (InterruptedException e) 
            e.printStackTrace();
         finally 
            serverSocket.close();
        
    

🏆(2)客户端程序如下

    public void client06() throws IOException 
        try 
            socket = new Socket("127.0.0.1", 8080);
            clientOutputStream = socket.getOutputStream();
            clientOutputStream.write(new byte[]'1', '2', '3', '4', '5', '6');
         finally 
            clientOutputStream.close();
            socket.close();
        


    

3.打开wireshark工具进行抓包


因为我这个是本地程序测试,所以对本地回环/回调接口进行抓包,也就是上图中的loopback

此 时 在 8080 端 口 没 有 抓 取 到 任 何 数 据 , 因 为 此 时 我 们 的 程 序 还 未 启 动 此时在8080端口没有抓取到任何数据,因为此时我们的程序还未启动 8080


先启动服务端小程序,然后再启动客户端小程序

此 时 再 去 看 w i r e s h a r k 窗 口 , 就 会 发 现 抓 取 了 很 多 包 此时再去看wireshark窗口,就会发现抓取了很多包 wireshark

前 三 行 就 是 所 谓 的 三 次 握 手 的 流 程 前三行就是所谓的三次握手的流程


4.举例了解一下TCP报文段中的ACK和Seq的含义


Seq(序号):简单了说序号就是该报文段首字节的字节流编号。比如,A主机向B主机发送一个大小为500000字节的数据流(报文),最大报文段长度(MSS)为1000字节,所以要为该数据流(报文)构建500个报文段,所以第一个报文段的seq(序号)就是0,第二个报文段的分配序号为1000,第三个2000,以此类推…

ACK(确认序号):它的意思是期望下一次对方发送给我以ACK为起始字节的数据。比如说,B主机发送给A主机一个报文段(范围为0~1000的所有字节);此时A主机打算发送一个报文段给B,它的目的是期望B主机给它发送1001及以后的数据,那么此时A->B报文段中的ACK=1001


5.流程分析

第一次握手:


首先客户端向服务端发送SYN标志,目的是告诉服务器我想与你建立连接(此时len = 0代表没有数据发送)

第二次握手:

第二次发送了SYN和ACK标志位。ACK = 1表示服务端期待下一次客户端发送给我的序号(seq)是1,seq=0也很好理解,这两次都没发送数据肯定是0呀(如果你看完了第4步seq和ack的例子应该很好理解)

第三次握手:

  • 此时的Seq=1应该好理解,因为上一次服务端发送给我的ACK=1(期待我发送1及其以后的数据给它),由于len=0,所以本次也不发送任何数据,三处握手不传输任何核心数据。
  • 此时ACK=1就是我期待服务端下一次发送给我的起始字节序号。

到这里三次握手就结束了,此外你可以看看三次握手之后的传输数据流程

相信应该比较容易理解(我代码中write了6个字节)
注意客户端的59712端口是系统分配的,我没有进行显示bind


6.为什么要进行三处握手?

其实这是因为无论是客户端还是服务端都无法确认对方能到接收到它的信息。最重要的原因还是防止已经失效的报文段突然又被服务端接收

以上是关于Wireshark抓包图解HTTPS连接过程的主要内容,如果未能解决你的问题,请参考以下文章

wireshark抓包图解 TCP三次握手/四次挥手详解

大白话系列图解TCP三次握手使用wireshark工具抓包分析TCP三次交互流程

wireshark抓包直观图解 TCP三次握手/四次挥手详解

用 Wireshark 图解:TCP 三次握手

TCP协议详解(图解三次握手四次挥手)

TCP协议详解(图解三次握手四次挥手)