抓包查看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连接,这可以通过观察后面的两个挥手包得知
相关推荐
y先森4 小时前
CSS3中的伸缩盒模型(弹性盒子、弹性布局)之伸缩容器、伸缩项目、主轴方向、主轴换行方式、复合属性flex-flow
前端·css·css3
前端Hardy4 小时前
纯HTML&CSS实现3D旋转地球
前端·javascript·css·3d·html
susu10830189114 小时前
vue3中父div设置display flex,2个子div重叠
前端·javascript·vue.js
IT女孩儿5 小时前
CSS查缺补漏(补充上一条)
前端·css
吃杠碰小鸡6 小时前
commitlint校验git提交信息
前端
虾球xz7 小时前
游戏引擎学习第20天
前端·学习·游戏引擎
我爱李星璇7 小时前
HTML常用表格与标签
前端·html
疯狂的沙粒7 小时前
如何在Vue项目中应用TypeScript?应该注意那些点?
前端·vue.js·typescript
小镇程序员7 小时前
vue2 src_Todolist全局总线事件版本
前端·javascript·vue.js
野槐7 小时前
前端图像处理(一)
前端