HTTPS

HTTPS 基于 HTTP,通过 SSL 或 TLS 提供加密处理数据、验证对方身份以及数据完整性保护功能。
HTTPS = HTTP + SSL 协议或 TLS 协议。也就是说 https 本质上是基于 http 协议的,只不过增加了一个安全层(SSL 协议或 TLS 协议)。
HTTPS 的目的是解决 http 传输过程中不安全的问题,简单来说它解决了三件事:
  • 数据明文传输,易泄露隐私
  • 无法对服务器进行身份认证。
  • 数据传输过程中易被篡改

加密

解决数据泄露的最好方式是对数据进行加密。https 使用了公钥加密和对称密钥加密结合的方式来加密数据,保证数据不会在传输过程中泄露信息。
公钥加密是服务器将公钥传给客户端,而私钥自己保存,客户端拿到公钥后对数据进行加密,然后发送到服务器上,只有服务器的私钥才能解密,也就是说只要服务器的私钥不泄露,安全性还是很高的。
对称加密是加密和解密都是同一个密钥,这种方式效率比较高,但是有个很大的问题,就是如何将密钥传给客户端,如果直接传输,那么就会很容易造成密钥泄露,那么加密就形同虚设了。
公钥加密的特点是安全性高,但是效率低,而对称密钥加密的特点是效率高,但是安全性低。
https 利用了两者的特点,先用公钥加密的方式将密钥传给客户端,这样解决了密钥泄露的风险,然后双方再使用对称密钥的方式进行加密通讯。

身份认证

https 通过数字证书来解决身份认证的问题。
第三方权威机构,对服务器进行认证,然后对服务器的公开密钥进行数字签名,并且将此公钥放入到为此服务器颁发的数字证书之中。
当客户端请求 https 时,服务器只需将数字证书发送给客户端,客户端可以通过数字证书进行认证,数字证书有两个作用。
  • 一是数字证书是经过权威机构加密过的,浏览器中内置解密密钥,同时数字证书难以伪造,因此将服务器公钥放入数字证书中可以避免公钥被篡改或者替换。
  • 二是客户端可以通过数字证书来对服务器进行身份认证,判断该服务器是否可以信赖。

避免篡改

HTTPS 在发送数据时会附加一种叫做 MAC(消息身份验证码)的报文摘要,MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。

HTTPS 握手流程

可以分为三步: 密钥协商、认证、加密
  1. 双发“协商”要使用的加密组件和 SSL(或 TLS)版本
  1. 服务器发送数字证书,客户端进行验证,并且从中去除公钥
  1. 客户端用取出来的公钥加密随机密码串,并发送服务器,服务器接收后用私钥解密,然后双发使用随机密码串来进行对称密钥加密通讯。
具体步骤
notion image
HTTPS通信
步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。步骤 5: SSL 第一次握手结束之后,客户端以 Client KeyExchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。步骤 8: 服务器同样发送 Change Cipher Spec 报文。步骤 9: 服务器同样发送 Finished 报文。步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。步骤 11: 应用层协议通信,即发送 HTTP 响应。步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP 的通信。