HTTPS具体是如何实现安全性的呢?HTTPS相对于HTTP多了一个“S”,这里的”S”指的是传输层安全协议(TLS)。可以理解为HTTPS=HTTP+TLS。
TLS是一种广泛采用的安全性协议,旨在保障互联网通信数据的保密性、完整性和真实性。其前身是1994年由Netscape公司设计SSL协议,在SSL发展到3.0版之后,互联网标准化组织将其更名为TLS,并先后发布了TLS1.0、1.1、1.2以及最新的1.3。目前应用最广泛的版本是1.2。
TLS是在TCP之上提供的传输安全层,位于应用层和传输层之前,其内部又可以分为两层,记录协议和握手协议,记录协议是建立在传输层协议(如TCP)之上的一层协议,TLS使用记录协议来为高层协议(如HTTP协议)提供数据封装、压缩、加密等基本功能的支持;握手协议是建立在记录协议之上的一种协议,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
握手协议的主要目的是为了确保通信双方之间的安全通信,包括保证数据之间的机密性、完整性和身份认证。
TLS握手过程中发生了什么呢?TLS握手过程是建立TLS安全通信的过程,主要包括以下四个步骤:
- TLS协议版本协商:指定将要使用的TLS版本,比如2、1.3。
- 密码套件协商:决定将要使用哪些密码套件,密码套件是一组用于建立安全通信连接的算法,下图可以看到客户端支持的密码套件列表。
解释如下:
- 身份验证:通过服务器的公钥和TLS证书颁发机构的数字签名来验证服务器的身份。
- 密钥协商:使用第二步确定的密码套件进行密钥交换,生成会话密钥。
下面以TLS1.2举例来详细看一下TLS的握手过程:
- 首先由客户端向服务端发送Client Hello消息。消息中主要包含了客户端支持的加密套件、TLS版本信息和客户端随机数。
- 服务器接收到消息后,返回自己支持的加密套件、TLS版本、自己的数字证书、服务端随机生成的随机数和密钥交换算法需要的参数。
- 客户端收到服务器的数字证书后,会对证书进行验证,以确认服务器的身份和证书的合法性,验证通过之后,客户端会生成密钥交换算法所需要的客户端参数,然后使用证书里的公钥加密后发送给服务器。
- 服务器接收到客户端发送过来的非对称加密密文,使用自己的私钥进行解密,获得了客户端参数。
到这里为止,服务端和客户端都有四组数据,分别是客户端随机数、服务器随机数、服务端参数、客户端参数。其中,由于客户端随机数、服务器随机数和服务器参数都是使用明文传输,所以这三个数据是有被暴露的风险,但由于客户端参数是使用非对称加密传输,十分安全,所以将这四者结合,使用之前协商好的特定的算法就可以生成一个密钥,这个密钥就是会话密钥,也就是之后用来对通信数据进行加密的对称加密的密钥。
- 最后,服务器会向客户端发送“Change Cipher Spec”和“Finished”的消息,告知客户端之后的通信切换到加密模式,握手已经完成。
至此,整个TLS的握手过程完整,之后就可以开始对称加密的通信了。
TLS握手完成了服务器身份验证和通信密钥的安全交换并生成了会话密钥,这个密钥将用于加密和解密通信中的数据,确保数据的完整性和机密性,通过TLS握手的整体流程可知,正常的TLS握手是需要两个 RTT,而正常的TLS1.3一般只需要一个RTT提高了握手的效率。
为了实现一个RTT,TLS1.3的思路就是在Client Hello阶段和Server Hello阶段完成在TLS1.2握手对应阶段的后续全部阶段,包括密钥交换和加密验证,这样就可以节省一个RTT,为了省去不必要的一个RTT,客户端不会被动的等待服务端回应对密钥套件的选择,在Client Hello阶段就直接猜测服务端可能会使用哪种密码套件中的密钥协商算法,然后把所有猜测用到的算法里需要的参数都给服务端即可。
因为TLS1.3对密码套件的挑选要求很高,导致服务器本身可选择的密码套件范围也很小,目前TLS1.3协议就只有5种密码套件类型可选,所以客户端猜测TLS1.2和TLC1.3协议里可能用到的参数全部发给服务器,也不会造成数据包过大的问题,因此客户端相当于在Client Hello阶段,把客户端参数和客户端随机数都告诉了服务器。接下来服务器选择哪种密码套件,就能知道客户端用了哪些参数,服务器端通过Client Hello阶段已经拿到了密钥交换运算需要的客户端随机数和客户端参数,接着服务器会生成一个随机数和服务器参数,然后使用选中的密钥协商算法来计算一个会话密钥,之后,服务器端会马上发起一个”Change Cipher Spec”消息,验证对方是否也可以计算出一样的派生密钥,并且把服务器随机数和服务器参数告诉客户端,同时还告诉客户端选择使用的密码套件,客户端收到已选择的密码套件和服务器端参数之后,计算出同样的对称加密密钥,也发出“Change cipher Spec”的消息,验证双方得出的对称密钥是否一致,最后客户端将进入HTTP的数据发送阶段,因此TLS1.3只需要一个RTT就完成了握手。