HTTPS 使用非对称加密来获取加密密钥,获取密钥后就可以双方都使用共享密钥进行加密通信 首先明确几个概念:
- 证书颁发中心 用自己的私钥将服务器的公钥加密后生成证书,然后服务器管理者将经过签名后的证书放置在自己的服务器中,等待用户请求。
- 浏览器 浏览器中会内置证书颁发中心的公钥(根证书),以对服务器的证书进行验证。
- 服务器 服务器会配置用户请求的证书也就是公钥,还有就是自己用于解密的私钥。
- 数字证书 将用户的公钥用私钥加密后通过SHA256产生一个32个字节长度数据,称作消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据是否发生改变,即验证其完整性。
- 用户在浏览器输入 https 的地址,首先浏览器会通过tcp的三次握手与服务器默认的443建立tcp 的连接。
- 浏览器发送
Client Hello
数据包,里面包含了自己支持的加密的方式和版本,以及一个随机码 - 服务器回应
Server Hello
的数据包,里面也包含了刚刚的随机码,并向浏览器确认了加密的方式 - 服务器通过
Certificate
报文 向浏览器下发自己配置的证书,然后以一个Server Hello Done
结束SSL握手。 - 浏览器通过自身内置的 证书颁发中心的公钥对浏览器下发的证书进行 认证,因为只有用 证书颁发中心的私钥加密的 服务器域名对应的公钥 才能用浏览器端的 证书颁发中心的公钥 解密。所以这一步是通过第三方的认证中心确保了拿到的服务器的公钥是正确的,而不是经过篡改的或过期的。
- 浏览器将 随机生成的 对称加密的密钥 用公钥加密后 放置在
Client Key Exchange
包中通知服务器后面通信使用的 对称加密的密钥(共享密钥)。 - 浏览器发出
change cipher spec
的报文提示,自己将用 共享密钥进行加密。 - 浏览器使用 共享密钥 加密一个
Finish
报文,然后发送到服务器。 - 服务器接收到使用公钥加密的共享密钥后用自己的私钥进行解密,然后得到后续加密用到的共享密钥。服务器通过共享密钥解析出
Finish
报文后也向浏览器发送一个change cipher spec
的报文,提示自己将去切换使用 共享密钥进行加密。 - 服务器发送 用共享密钥加密的
Finish
报文。 - 双发使用 共享密钥加密进行安全通信。直到浏览器发出
Close_notify
报文告知自己将关闭连接。
C1 S3 C3 S2 客户端一次报文,服务端 三次 客户端 三次 服务端 两次