SSL协议分析

发布于 2026-03-06  62 次阅读


理论

HTTPS建立连接的过程图

image-20250813143233380

过程详解

1client hello

即图中的客户端发送“客户端随机数”

随机数,生成一个32字节随机数。最后加密数据用的主密钥,需要客户端和服务端一起协商出来。后面服务端的 Server Hello 阶段也会生成一个随机数。一同用来计算出主密钥。

加密套件 ,客户端可以支持的密码套件列表。这些套件会根据优先级排序。每一个套件代表一个密钥规格。以 “TLS” 开头,接着是密钥交换算法,然后用“WITH” 连接加密算法和认证算法。一个加密套件有这么几个内容:密钥交换算法、加密算法(会带有支持的最高密钥位数)、认证算法还有加密方式。

客户端提供多种密码套件供服务端选择,最终使用什么密码套件是服务端决定的。要什么密码套件会在 Server Hello 中进行反馈。

2. server hello

即图中的服务器端发送“服务器端随机数”

在此阶段,服务器端收到客户端的 Hello,通过客户端的配置信息,结合服务端的自身情况,给出了最终的配置信息。

随机数 ,上面的 Client Hello 过程也生产了一个 32 位随机数,这两个随机数将参与主密钥的创建。

加密算法ECDHE ,就是EC Diffie-Hellman,也称DH加密算法

3. Certificate

即图中的服务器端发送“服务器端证书”

上面的 Server Hello 已经制定了接下来的非对称加密算法。

服务端下发证书,客户端验证服务端的身份,并且取出证书携带的公钥,这个公钥是交换加密算法的公钥。也就是在 Server Hello 阶段指定的 ECDHE (EC Diffie-Hellman)算法,也是通常说的 DH 加密。

这个 Certificate 消息下发了从携带自己公钥的数字证书和 CA 证书的证书链。

4. Server Key Exchange

密钥交换阶段,这个步骤是可选步骤,对 Certificate 阶段的补充,只有在这几个场景存在:

a) 协商采用了 RSA 加密,但是服务端证书没有提供 RSA 公钥。

b) 协商采用了 DH(EC Diffie-Hellman) 加密,但是服务端证书没有提供 DH 参数。

c) 协商采用 fortezza_kea 加密,但是服务端证书没有提供参数。

此实验中在前面协商了使用 EC Diffie-Hellman 算法,而且没带参数,所以这个包就是服务端带过来的用来协商 DH 密钥参数的。

5. Server Hello Done

通知客户端,版本和加密套件协商结束。

6 . Client Key Exchange

这里,客户端不直接生成加密密钥,而是通过之前客户端和服务端生成的随机数又再生成一个随机数,使用前面协商好的用 EC Diffie-Hellman 算法进行加密传输给服务端。

服务端收到这个报文后,会使用自己的私钥解开这个随机数。

在这个阶段过后,服务端和客户端都有三个随机数:客户端随机数、服务端随机数和预备主密钥。

在服务端收到了 Client Key Exchange 消息后,两端都按照相应的算法生成了主密钥,加密密钥交换完成。

如何保证这个主密钥是正确的?

这时候会进入下一个阶段。客户端和服务端会对握手信息使用 SHA 做个摘要,用 AES 加密算法和主密钥加密,传递给对方验证。这种方式也称为消息认证。就是以下的过程:

7. Change Cipher Spec(Client)

客户端通知服务端,后续的报文将会被加密。

8. Encrypted Handshake Message(Client)

这里就是客户端的 Client Finished 消息。也是整个 SSL 过程中,发送给服务端的第一个加密消息。服务端接收后,服务端用同样的方式计算出已交互的握手消息的摘要,与用主密钥解密后的消息进行对比,一致的话,说明两端生成的主密钥一致,完成了密钥交换。

9. Change Cipher Spec(Server)

服务端通知客户端,后续的报文将会被加密。

10. Encrypted Handshake Message(Server)

这里就是服务端的 Server Finish 消息。和上面的客户端的 Encrypted Handshake Message 一样,是服务端发出的第一条加密信息。客户端按照协商好的主密钥解密并验证正确后,SSL 握手阶段完成。

后面就开始进行数据加密传输,这就是HTTPS建立连接的过程。

抓包分析

Client hello阶段

在这里插入图片描述

Server hello阶段

在这里插入图片描述

Certificate阶段

在这里插入图片描述

Server Key Exchange阶段

因为协商采用了 DH(EC Diffie-Hellman) 加密,但是服务端证书没有提供 DH 参数。所以这个包就是服务端带过来的用来协商 DH 密钥参数的。

在这里插入图片描述

Server Hello Done阶段

通知客户端,版本和加密套件协商结束。

在这里插入图片描述

Server Hello Done阶段

通知客户端,版本和加密套件协商结束。

在这里插入图片描述

Client Key Exchange阶段

这里,客户端不直接生成加密密钥,而是通过之前客户端和服务端生成的随机数又再生成一个随机数,使用前面协商好的用 EC Diffie-Hellman 算法进行加密传输给服务端。

在这里插入图片描述

Change Cipher Spec(Client)阶段

客户端通知服务端,后续的报文将会被加密

在这里插入图片描述

Encrypted Handshake Message(Client)阶段

这里就是客户端的 Client Finished 消息。也是整个 SSL 过程中,发送给服务端的第一个加密消息。服务端接收后,服务端用同样的方式计算出已交互的握手消息的摘要,与用主密钥解密后的消息进行对比,一致的话,说明两端生成的主密钥一致,完成了密钥交换。

在这里插入图片描述

new session ticket阶段

在这里插入图片描述

Change Cipher Spec(Server)阶段

服务端通知客户端,后续的报文将会被加密。

在这里插入图片描述

Encrypted Handshake Message(Server)阶段

这里就是服务端的 Server Finish 消息。和上面的客户端的 Encrypted Handshake Message 一样,是服务端发出的第一条加密信息。客户端按照协商好的主密钥解密并验证正确后,SSL 握手阶段完成。

在这里插入图片描述

此时通过数据包可以看到,已经是加密传输

在这里插入图片描述

Daniel_WRF
最后更新于 2026-03-06