抓包查看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连接,这可以通过观察后面的两个挥手包得知
相关推荐
css趣多多8 分钟前
案例自定义tabBar
前端
林的快手2 小时前
CSS列表属性
前端·javascript·css·ajax·firefox·html5·safari
匹马夕阳2 小时前
ECharts极简入门
前端·信息可视化·echarts
API_technology2 小时前
电商API安全防护:JWT令牌与XSS防御实战
前端·安全·xss
yqcoder2 小时前
Express + MongoDB 实现在筛选时间段中用户名的模糊查询
java·前端·javascript
十八朵郁金香3 小时前
通俗易懂的DOM1级标准介绍
开发语言·前端·javascript
m0_528723814 小时前
HTML中,title和h1标签的区别是什么?
前端·html
Dark_programmer4 小时前
html - - - - - modal弹窗出现时,页面怎么能限制滚动
前端·html
GDAL4 小时前
HTML Canvas clip 深入全面讲解
前端·javascript·canvas
禾苗种树4 小时前
在 Vue 3 中使用 ECharts 制作多 Y 轴折线图时,若希望 **Y 轴颜色自动匹配折线颜色**且无需手动干预,可以通过以下步骤实现:
前端·vue.js·echarts