抓包分析https的传输过程

参考:https://www.jianshu.com/p/7158568e4867

1.

首先,浏览器和服务器三握手,建立连接。

下面是https的发包过程:

2.浏览器发送client hello:

客户端给服务器发送一个随机值random1,和加密(暗号)套件。

3.

服务器ack,意思是,你的hello数据包我收到了。

4.

服务器给浏览器(客户端)发送server hello

同时我们从数据包中发现服务器也给客户端发送了一个随机值random2和证书。

5.

客户端回复ACK,你的hello数据包和证书我收到了。

6.

先不看 数据包的内容,客户端需要验证服务器发过来的证书的合法性:通过操作系统内置的ca证书,来验证服务器证书的颁发者和过期时间是否合法,如果存在数据签名,则用操作系统中颁发者CA的公钥对签名解密,用相同的hash算法算出签名的hash值,将这个hash值与签名中的hash值对比。验证是否是真实的服务器发送的。

再来看上面的数据包:

Client Key Exchange

客户端验证通过,取出证书中的公钥,然后再生成一个随机数random3,用这个公钥对random3加密,生成PreMaster Key,客户端根据服务器传来的公钥生成了 PreMaster Key,Client Key Exchange 就是将这个 key 传给服务端,服务端再用自己的私钥解出这个 PreMaster Key 得到客户端生成的 Random3。至此,客户端和服务端都拥有 Random1 + Random2 + Random3,两边再根据同样的算法就可以生成一份秘钥,握手结束后的应用层数据都是使用这个秘钥进行对称加密。为什么要使用三个随机数呢?这是因为 SSL/TLS 握手过程的数据都是明文传输的,并且多个随机数种子来生成秘钥不容易被暴力破解出来。

Change Cipher Spec(Client)

这一步是客户端通知服务端后面再发送的消息都会使用前面协商出来的秘钥加密了,是一条事件消息。

Encrypted Handshake Message(Client)

这一步对应的是 Client Finish 消息,客户端将前面的握手消息生成摘要再用协商好的秘钥加密,这是客户端发出的第一条加密消息。服务端接收后会用秘钥解密,能解出来说明前面协商出来的秘钥是一致的。

7.

发布了66 篇原创文章 · 获赞 230 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/lyztyycode/article/details/81259284