理论
HTTPS建立连接的过程图
过程详解
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建立连接的过程。
抓包分析
使用wireshark进行抓包
使用浏览器访问https://www.baidu.com
查看wireshark抓取到的数据包
先查看DSN解析的www.baidu.com,此处可看到解析的CNAME
使用nslookup解析www.baidu.com
查看IP地址
抓包观察
建立HTTPS连接前,首先进行了TCP三次“握手”
过滤条件以显示https建立过程
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 握手阶段完成。
此时通过数据包可以看到,已经是加密传输
在浏览器中查看对应的证书
原文始发于微信公众号(泷羽sec-何生安全):抓包分析ssl协议
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论