HTTPS握手过程
HTTPS的握手过程比较繁琐,我们来回顾下。
先是建立TCP连接,毕竟HTTP是基于TCP的应用层协议。
在TCP成功建立完协议后,就可以开始进入HTTPS阶段。
HTTPS可以用TLS或者SSL啥的进行加密,下面我们以TLS1.2
为例。
总的来说。整个加密流程其实分为两阶段。
第一阶段是TLS四次握手,这一阶段主要是利用非对称加密的特性各种交换信息,最后得到一个"会话秘钥"。
第二阶段是则是在第一阶段的"会话秘钥"基础上,进行对称加密通信。
我们先来看下第一阶段的TLS四次握手是怎么样的。
第一次握手:
-
•
Client Hello
:是客户端告诉服务端,它支持什么样的加密协议版本,比如TLS1.2
,使用什么样的加密套件,比如最常见的RSA
,同时还给出一个客户端随机数。
第二次握手:
-
•
Server Hello
:服务端告诉客户端,服务器随机数 + 服务器证书 + 确定的加密协议版本(比如就是TLS1.2)。
第三次握手:
-
•
Client Key Exchange
: 此时客户端再生成一个随机数,叫pre_master_key
。从第二次握手的服务器证书里取出服务器公钥,用公钥加密pre_master_key
,发给服务器。 -
•
Change Cipher Spec
: 客户端这边已经拥有三个随机数:客户端随机数,服务器随机数和pre_master_key,用这三个随机数进行计算得到一个"会话秘钥"。此时客户端通知服务端,后面会用这个会话秘钥进行对称机密通信。 -
•
Encrypted Handshake Message
:客户端会把迄今为止的通信数据内容生成一个摘要,用"会话秘钥"加密一下,发给服务器做校验,此时客户端这边的握手流程就结束了,因此也叫Finished报文。
第四次握手:
-
•
Change Cipher Spec
:服务端此时拿到客户端传来的pre_master_key
(虽然被服务器公钥加密过,但服务器有私钥,能解密获得原文),集齐三个随机数,跟客户端一样,用这三个随机数通过同样的算法获得一个"会话秘钥"。此时服务器告诉客户端,后面会用这个"会话秘钥"进行加密通信。 -
•
Encrypted Handshake Message
:跟客户端的操作一样,将迄今为止的通信数据内容生成一个摘要,用"会话秘钥"加密一下,发给客户端做校验,到这里,服务端的握手流程也结束了,因此这也叫Finished报文。
四次握手中,客户端和服务端最后都拥有三个随机数,他们很关键,我特地加粗了表示。
第一次握手,产生的客户端随机数,叫client random
。
第二次握手时,服务器也会产生一个服务器随机数,叫server random
。
第三次握手时,客户端还会产生一个随机数,叫pre_master_key
。
这三个随机数共同构成最终的对称加密秘钥,也就是上面提到的"会话秘钥"。
你可以简单的认为,只要知道这三个随机数,你就能破解HTTPS通信。
而这三个随机数中,client random
和 server random
都是明文的,谁都能知道。而pre_master_key
却不行,它被服务器的公钥加密过,只有客户端自己,和拥有对应服务器私钥的人能知道。