致谢

感谢 CSDN 上的无数搬运工,他们为增加解决问题的难度做出了巨大的贡献。

如果不是他们,我可能看不到 CSDN 上满屏雷同文章却无一能解决问题的盛况,感谢他们。

正文

CA证书签发

  1. 服务器向第三方机构 CA 提交公钥、以及基本信息并申请认证。
  2. CA 审核通过,签发证书,证书内容包括申请者公钥、申请者的信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名,该签名由摘要算法计算明文信息摘要,并使用 CA 机构的私钥加密生成。

建立HTTPS连接

  1. 浏览器、服务器双方三次握手建立 TCP 连接或者采用 TCP 快启策略
  2. TLS 1.2 建立连接
    1. 浏览器向服务器发出 Client Hello 消息,其中携带客户端支持的协议版本、加密算法、压缩算法以及客户端生成的随机数。
    2. 服务器向浏览器发送 Server Hello 消息,并携带选择特定的协议版本、加密方法、会话 ID 以及服务端生成的随机数。
      1. 向客户端发送 Certificate 消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息。
      2. 向客户端发送 Server Key Exchange 消息,传递公钥以及签名等信息。
      3. 向客户端发送可选的消息 CertificateRequest,验证客户端的证书。
      4. 向客户端发送 Server Hello Done 消息,通知服务端已经发送了全部的相关信息。
    3. 浏览器使用 CA 机构相同的摘要算法计算明文信息摘要,并用 CA 机构的公钥验证签名
      1. 向服务端发送 Client Key Exchange 消息,包含使用服务端公钥加密后的两个随机数生成的随机字符串,即预主密钥(Pre Master Secret)。
      2. 向服务端发送 Change Cipher Spec 消息,通知服务端后面的数据段会加密传输。
      3. 向服务端发送 Finished 消息,其中包含加密后的握手信息。
    4. 服务端收到 Change Cipher Spec 和 Finished 消息。
      1. 向客户端发送 Change Cipher Spec 消息,通知客户端后面的数据段会加密传输。
      2. 向客户端发送 Finished 消息,验证客户端的 Finished 消息并完成 TLS 握手。
  3. 浏览器、服务器双方使用该密钥进行通信。
    1. 随着请求的数量逐渐增加,HTTP/2 就可以复用已经建立的 TCP 连接减少 TCP 和 TLS 握手带来的额外开销。

拓展

非对称加密的验证过程‌

  1. 验证者获得明文信息以及数字签名。采用提供者提供的公钥对数字签名进行解密得到消息摘要 S1
  2. 验证者对明文信息进行相同摘要算法的运算,获得消息摘要 S2
  3. S1 equals S2 则可验证改明文信息是由提供者发送且未被篡改。

这里使用到了数字签名的方式,即私钥加密消息摘要生成数字签名。

私钥加密的数据可以用公钥解密,使用私钥加密整段数据没有意义,而采用数字签名能够保证数据不被篡改,再使用私钥加密,能确保发送者的身份,这样一来既保证了消息未被篡改,又保证了消息未被伪造。

引用