HTTPS加密通信核心流程:
-
服务器生成一对非对称加密密钥(包括公钥和私钥)
-
客户端发送 client hello 信息(带上自己支持的 SSL/TLS 支持的版本,密码套件,和一个Client Random)
-
服务端发送 server hello 信息,带上 Server Random 和数字证书(包含自身公钥)
-
客户端验证证书
-
TLS 1.2:客户端生成预主密钥(Pre-Master Secret),用服务器公钥加密后发送
TLS 1.3:直接通过前向加密算法(如ECDHE)交换共享密钥,无需加密传输预主密钥
-
服务器用私钥解密,获取Pre-Master Secret(或直接拿到共享密钥)
-
服务端和客户端用相同的Pre-Master Secret/共享密钥 和两者互换的随机数生成一个相同的master key
-
客户端会发送一个Change Cipher Spec消息,告知服务器已准备好使用新的加密密钥进行通信,并同时发送一个用master key 加密的 Finished 消息,以验证加密密钥的正确性
-
服务器在接收到这些消息后,也会进行相应的验证和处理。一旦验证通过,服务器会同样发送一个Change Cipher Spec消息和一个使用master key加密的Finished消息给浏览器,表示握手过程已完成
-
后续所有数据传输均使用master key进行对称加密
服务器如何获取 CA 证书
- 服务器将公钥送至CA
- CA通过严格流程验证申请者的合法性
- 验证通过后,CA 会用自己的私钥对服务器的公钥和相关信息进行数字签名,然后将签名后的数据与服务器公钥、CA信息等封装成数字证书,并返回给服务端
客户端如何验证证书
- 收到服务器的证书后,客户端逐级验证证书链是否完整:服务器证书 → 中间CA证书 → 根CA证书(根CA证书已预装在操作系统或浏览器中)
- 之后验证签名:用CA的公钥解密证书中的签名,得到摘要Hash,然后对证书内容重新计算摘要,与解密后的摘要比对,确保未被篡改