抓包查看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连接,这可以通过观察后面的两个挥手包得知
相关推荐
qiyi.sky9 分钟前
JavaWeb——Vue组件库Element(3/6):常见组件:Dialog对话框、Form表单(介绍、使用、实际效果)
前端·javascript·vue.js
煸橙干儿~~13 分钟前
分析JS Crash(进程崩溃)
java·前端·javascript
安冬的码畜日常22 分钟前
【D3.js in Action 3 精译_027】3.4 让 D3 数据适应屏幕(下)—— D3 分段比例尺的用法
前端·javascript·信息可视化·数据可视化·d3.js·d3比例尺·分段比例尺
l1x1n01 小时前
No.3 笔记 | Web安全基础:Web1.0 - 3.0 发展史
前端·http·html
昨天;明天。今天。1 小时前
案例-任务清单
前端·javascript·css
zqx_72 小时前
随记 前端框架React的初步认识
前端·react.js·前端框架
惜.己3 小时前
javaScript基础(8个案例+代码+效果图)
开发语言·前端·javascript·vscode·css3·html5
什么鬼昵称3 小时前
Pikachu-csrf-CSRF(get)
前端·csrf
长天一色3 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
NiNg_1_2344 小时前
npm、yarn、pnpm之间的区别
前端·npm·node.js