抓包查看TLS握手过程

之前学习过HTTPS的加密过程,记下整个流程倒不是难事.后来朋友问了一句"你怎么知道的?"顿时哑然.因此,便尝试自己抓包,看看TLS的握手过程,以此作为一个对自己学习内容的印证.其中,由于包信息中涉及加密等内容,笔者只懂皮毛,便不对加密算法做探索与记录.

与ChatGPT探讨

询问ChatGPT 3.5

你可以详细地说说,https请求中,客户端与服务器端的握手、挥手过程吗?

ChatGPT 3.5回复

当客户端和服务器端建立 HTTPS 连接时,会进行 SSL/TLS 握手过程,这个过程包括握手和挥手阶段。以下是 HTTPS 请求中客户端和服务器端的握手和挥手过程的详细步骤:

1.握手阶段(Handshake):
  • 客户端Hello:客户端向服务器发送一个 ClientHello 消息,其中包含客户端支持的 SSL/TLS 版本、加密算法、压缩算法等信息。
  • 服务器Hello:服务器收到 ClientHello 后,返回一个 ServerHello 消息,其中包含服务器选择的 SSL/TLS 版本、加密算法、压缩算法等信息。
  • 服务器证书:服务器可能会发送一个包含服务器证书的 Certificate 消息,证书包含了服务器的公钥。
  • 服务器Key Exchange(可选):如果服务器要求客户端发送一个临时公钥,则服务器会发送一个 ServerKeyExchange 消息。
  • 服务器Hello Done:服务器发送 ServerHelloDone 消息,表示握手阶段的结束。
  • 客户端Key Exchange:如果服务器要求客户端发送一个临时公钥,则客户端发送一个 ClientKeyExchange 消息。
  • 客户端Hello Done:客户端发送 ClientHelloDone 消息,表示握手阶段的结束。
2.数据传输阶段:
  • 客户端和服务器通过 SSL/TLS 协议进行加密通信,发送和接收应用层的数据。
3.挥手阶段(Shutdown):
  • 客户端关闭:客户端发送一个关闭通知(close_notify)给服务器,表示客户端不再发送数据,并准备关闭连接。
  • 服务器关闭:服务器收到关闭通知后,发送一个关闭通知给客户端,表示服务器也准备关闭连接。
  • 连接关闭:双方都收到关闭通知后,关闭连接,结束通信。 在 HTTPS 请求中,这些握手和挥手过程发生在 SSL/TLS 协议层,用于建立安全的加密通道,并确保通信的安全性和完整性。

抓包验证

抓包

  • 下载、安装、打开wireshark
  • 开始抓包
  • 打开一个会产生https请求的网址
  • 网址加载完之后,停止抓包
  • 在协议这一列,找有TLS的行(SSL还没遇到过),记下这次请求的发送方(Source)以及接收方(Destination)
  • 筛选出相关的请求(ip.src为发送方,ip.dst为接收方)
  • 如此,我们获取了https连接相关的内容

三次握手

先看一下http三次握手的流程

回看前面抓取的前三个包,会发现是一样的

逐个包查看其中的内容:

  • 第一个包,标志位(Flags)中,Syn(SYN)置为1,Sequence number(seq)初始化为0
  • 第二个包,标志位(Flags)中,Syn(SYN)置为1,Acknowledgment(ACK)置为1,Sequence number(seq)初始化为0,Acknowledgment number(ack)为上一个包的seq值加1
  • 第三个包,标志位(Flags)中,Syn(SYN)置为1,Acknowledgment number(ack)为上一个包的seq值加1

会发现,这次的https请求中,首先进行的是http三次握手的过程

TLS连接

将所有TLS请求筛选出来

第一个包是Client Hello,其中可以看到客户端加密需要生成的随机数(Random),公钥交换的协商内容(psk_key_exchange_modes),密钥交换的参数(key_share)

第二个包是Server Hello,其中可以看到服务器生成的随机数、应用层协议的协商

第三个包中包含了三个部分:Certificate,Server Key Exchange,Server Hello Done

  • Server Key Exchange部分,主要为证书信息。数字签名(signature),证书颁发者(issuer),有效期(validity),证书信息(subject),公钥信息(subjectPublicKeyInfo),算法信息(algorithmIdentifier)
  • Server Key Exchange部分,主要为密钥交换信息。其中有所使用的密钥交换算法(这里是Diffie-Hellman)、生成的公钥以及算法相关的参数
  • Server Hello Done部分,表示服务器的Server Hello需要传输的内容已经传输完毕

第四个包中包含了三个部分:Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message

  • Client Key Exchange,主要为客户端密钥交换的信息,具体信息取决于前面协商过程中协商使用的算法
  • Change Cipher Spec,主要用于告知服务器端通信的密码规范已经更改,并附加新的加密参数
  • Encrypted Handshake Message,主要表示握手过程的最后阶段中的"Finished",用于确认握手过程已经成功并且没有被篡改

第五个包中包含了两个部分:Change Cipher Spec,Encrypted Handshake Message

  • Change Cipher Spec,主要用于告知客户端使用协商好的加密算法和密钥进行加密
  • Encrypted Handshake Message,同样是表示握手中的"Finished",确保通信双方都正确地接受到握手消息

后续的第六、七个包都是Application Data,即握手成功后用于传输实际应用层数据的包

  • Application Data中,最主要的为加密后的数据信息(Encrypted Application Data)

第八个包为Encrypted Alert

  • Encrypted Alert主要有以下作用:通知对方连接的状态、通知对方连接发生错误以及安全关闭连接
  • 在这里,主要为告知服务器端数据传输完毕,关闭TLS连接,这可以通过观察后面的两个挥手包得知
相关推荐
余生H22 分钟前
前端Python应用指南(二)深入Flask:理解Flask的应用结构与模块化设计
前端·后端·python·flask·全栈
outstanding木槿27 分钟前
JS中for循环里的ajax请求不数据
前端·javascript·react.js·ajax
酥饼~34 分钟前
html固定头和第一列简单例子
前端·javascript·html
一只不会编程的猫37 分钟前
高德地图自定义折线矢量图形
前端·vue.js·vue
m0_7482509339 分钟前
html 通用错误页面
前端·html
来吧~1 小时前
vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)
前端·vue.js·音视频
魔术师卡颂1 小时前
最近看到太多 cursor 带来的焦虑,有些话想说
前端·aigc·openai
鎈卟誃筅甡1 小时前
Vuex 的使用和原理详解
前端·javascript
火山方舟1 小时前
解密!企业级智能客服高效运营的秘密武器 | 大模型流程设计与Prompt模版
前端·人工智能·稀土
呆呆小雅1 小时前
二、创建第一个VUE项目
前端·javascript·vue.js