HTTPS 流程
致谢
感谢 CSDN 上的无数搬运工,他们为增加解决问题的难度做出了巨大的贡献。
如果不是他们,我可能看不到 CSDN 上满屏雷同文章却无一能解决问题的盛况,感谢他们。
正文
CA证书签发
- 服务器向第三方机构 CA 提交公钥、以及基本信息并申请认证。
- CA 审核通过,签发证书,证书内容包括申请者公钥、申请者的信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名,该签名由摘要算法计算明文信息摘要,并使用 CA 机构的私钥加密生成。
建立HTTPS连接
- 浏览器、服务器双方三次握手建立 TCP 连接或者采用 TCP 快启策略。
- TLS 1.2 建立连接
- 浏览器向服务器发出 Client Hello 消息,其中携带客户端支持的协议版本、加密算法、压缩算法以及客户端生成的随机数。
- 服务器向浏览器发送 Server Hello 消息,并携带选择特定的协议版本、加密方法、会话 ID 以及服务端生成的随机数。
- 向客户端发送 Certificate 消息,即服务端的证书链,其中包含证书支持的域名、发行方和有效期等信息。
- 向客户端发送 Server Key Exchange 消息,传递公钥以及签名等信息。
- 向客户端发送可选的消息 CertificateRequest,验证客户端的证书。
- 向客户端发送 Server Hello Done 消息,通知服务端已经发送了全部的相关信息。
- 浏览器使用 CA 机构相同的摘要算法计算明文信息摘要,并用 CA 机构的公钥验证签名。
- 向服务端发送 Client Key Exchange 消息,包含使用服务端公钥加密后的两个随机数生成的随机字符串,即预主密钥(Pre Master Secret)。
- 向服务端发送 Change Cipher Spec 消息,通知服务端后面的数据段会加密传输。
- 向服务端发送 Finished 消息,其中包含加密后的握手信息。
- 服务端收到 Change Cipher Spec 和 Finished 消息。
- 向客户端发送 Change Cipher Spec 消息,通知客户端后面的数据段会加密传输。
- 向客户端发送 Finished 消息,验证客户端的 Finished 消息并完成 TLS 握手。
- 浏览器、服务器双方使用该密钥进行通信。
- 随着请求的数量逐渐增加,HTTP/2 就可以复用已经建立的 TCP 连接减少 TCP 和 TLS 握手带来的额外开销。
拓展
非对称加密的验证过程
- 验证者获得明文信息以及数字签名。采用提供者提供的公钥对数字签名进行解密得到消息摘要
S1
。 - 验证者对明文信息进行相同摘要算法的运算,获得消息摘要
S2
。 - 若
S1 equals S2
则可验证改明文信息是由提供者发送且未被篡改。
这里使用到了数字签名的方式,即私钥加密消息摘要生成数字签名。
私钥加密的数据可以用公钥解密,使用私钥加密整段数据没有意义,而采用数字签名能够保证数据不被篡改,再使用私钥加密,能确保发送者的身份,这样一来既保证了消息未被篡改,又保证了消息未被伪造。