HTTPS流程

Posted by 孙继峰 on May 7, 2020

图片来自 ImportNew

1. ClientHello

TCP建立连接之后, TLS握手的第一步由客户端发起, 发送ClientHello的消息到服务器. ClientHello消息包含:

  • 客户端支持的SSL/TLS版本
  • 客户端支持的加密套件(Cipher Suites)
  • session id(如果有的值的话, 服务器端会复用对应的握手信息, 避免短时间内重复握手)
  • 随机数client-random
2. ServerHello

服务器端在收到这个ClientHello, 从中选择服务器支持的版本和套件, 发送ServerHello消息到客户端. ServerHello消息包含:

  • 服务器所能支持的最高SSL/TLS版本
  • 服务器选择的加密套件
  • 随机数server-random
  • 服务器分配的 session id

随后服务器发送证书(包含公钥)

3. 证书验证

客户端收到ServerHello后, 会对收到的证书进行验证. 如果通过验证, 客户端生成一个随机数pre-master, 用于密钥交换过程.

4. ClientKeyExchange

客户端用第三步中服务器的证书中拿到服务器的公钥, 用这个公钥加密pre-master发送给服务器.

5. 服务器获得 pre-master

服务器收到第四步的信息之后, 用服务器的私钥对密文进行解密得到密钥pre-master.

6. 生成秘钥

客户端用 client-random + server-random + pre-master 一起计算出对称密钥 master secret.
服务器端也用 client-random + server-random + pre-master 一起计算出对称密钥 master secret.
现在客户端和服务器均有密钥 master secret 了, 后面就可以用它来进行加密和解密了.

7. ClientFinish

客户端用master secret加密了一条握手完成的消息发送给服务器。

8. ServerFinish

服务器端也回发了一条用master secret加密的握手完成的消息。

9. ExchangeMessage

当两方都收到对方发送的握手消息之后, 也成功解密后, 就可以用master secret开始数据加密和解密了.