HTTPS安全套接字层超文本传输协议

  • HTTPS简介
  • HTTPS和HTTP的主要区别
  • 客户端在使用HTTPS方式与Web服务器通信时的步骤
  • SSL/TLS协议的加密(握手)过程
  • 为什么数据传输阶段使用对称加密
  • HTTPS 的优点
  • HTTPS 的缺点
  • HTTPS 的优化
    • 证书优化
    • 会话复用

HTTPS简介

HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS,为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL/TLS协议,SSL/TLS依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS协议的主要作用有两点:第一点是建立一个信息安全通道,来保证数据传输的安全;另一点就是确认网站的真实性。

HTTPS和HTTP的主要区别

  1. https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  3. http和https使用的端口也不一样,前者是80,后者是443。

客户端在使用HTTPS方式与Web服务器通信时的步骤

HTTPS的整体过程分为证书验证数据传输两阶段。
(1)证书验证阶段

  1. 浏览器发起 HTTPS 请求。
  2. 服务端返回 HTTPS 证书,证书中包含服务端的公钥
  3. 客户端验证证书是否合法,证书验证阶段采用非对阵加密,如果不合法则提示告警。

(2)数据传输阶段

  1. 当证书验证合法后,在本地生成随机数。
  2. 通过公钥加密随机数,并把加密后的随机数传输到服务端。
  3. 服务端通过私钥对随机数进行解密。
  4. 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后发送给浏览器。

SSL/TLS协议的加密(握手)过程

SSL/TLS的握手过程如下:

  1. 客户端给出支持SSL协议版本号,一个客户端随机数N1,客户端支持的加密方法等信息。
  2. 服务器收到信息后,确认双方使用的加密通信协议,并返回数字证书,一个服务器生成的随机数N2等信息。
  3. 客户端确认数字证书的有效性,然后生成一个新的随机数N3,然后使用数字证书中的公钥,加密这个随机数,发给服务器。
  4. 服务器使用自己的私钥,获取客户端发来的随机数N3,并通过约定的对称加密方法,使用前面三个随机数N1、N2、N3生成会话密钥,用来加密接下来的通信内容(对称加密)。

SSL/TSL通过四次握手,主要交换三个信息:

  1. 数字证书。
  2. 三个随机数。
  3. 加密通信协议。

为什么数据传输阶段使用对称加密

  • 非对称加密的加解密效率是非常低的,而 http 的应用场景中通常端与端之间存在大量的交互,非对称加密的效率是无法接受的。

  • 在 HTTPS 的场景中只有服务端保存了私钥,一对公私钥只能实现单向的加解密,所以HTTPS 中内容传输加密采取的是对称加密,而不是非对称加密。

HTTPS 的优点

HTTPS 协议是由SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中不被窃取、修改,确保数据的完整性。

HTTPS 的缺点

  1. HTTPS协议握手阶段比较费时。
  2. HTTPS连接会增加数据开销。
  3. CA证书需要一定费用越高。

HTTPS 的优化

证书优化

证书优化主要有两方面:

  1. 证书传输:证书越小,传输的就越快。选择不同的加密方法,生成的证书的大小也不一样。
  2. 证书验证:证书验证有的时候不仅需要验证证书是否被篡改,还需要验证证书是否被吊销。之前是由CA机构维护一个吊销证书列表CRL,客户端每次要下载CRL,然后验证证书是否被吊销。随着吊销证书的增多,CRL的大小越来越大。也会导致HTTPS连接变慢。所以引入了OCSP,在线证书状态协议,客户端直接向CA机构发送证书编号,CA机构会返回证书的状态,不需要每次下载CRL,提高了效率。

会话复用

服务器为每个客户端在会话过程中设置一个SessionID,在会话期间将第一次生成的密钥分别保存在客户端和服务器,服务器通过SessionID来保存对应的密钥。当客户端再次连接的时候,直接传入SessionID,然后使用客户端的密钥进行加密。服务器收到后,通过SessionID获取对应的密钥,然后解密。这样客户端就可以复用一个密钥,不用每次都新生成密钥。