之前学习过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连接,这可以通过观察后面的两个挥手包得知