在HTTP协议中,TCP连接建立之后,浏览器会立即发送请求报文。在HTTPS中,TCP建立连接之后,还需要TLS中的握手,即在TCP之上建立安全连接,才能收发HTTP报文。

  • 客户端先向服务端say hello,同时发送一个客户端随机数+客户端TLS版本号+密码套件相关信息到服务端;
  • 服务端收到打招呼信息之后,也向客户端say hello,并且发送一个服务端随机数+TLS版本确认+选择使用的密码套件到客户端。注意以上提到的两个随机数,用于后续算法交换密钥。然后,为了证明服务端身份,服务端发送了证书(证书链)给客户端。然后又把服务端公钥(椭圆曲线公钥)Server Params+签名认证发给了客户端,用来实现密钥交换。

以上一来一往之后,双方通过明文信息共享了三个信息:Client Random、Server Random 和 Server Params(服务端公钥)。

  • 客户端收到证书链后,开始走证书链逐级验证,在用证书公钥验证签名,从而确定服务端身份。之后,根据双方约定的密码套件,生成了一个客户端公钥(椭圆曲线公钥)Client Params,再发消息给服务端。
  • 如此,双方拥有了密钥交换算法的两个参数:Client Params、Server Params。通过ECDHE算法,双方算出Pre-Master,也是一个随机数。(ECDHE算法保证了即使客户获取了Client Params、Server Params也无法计算出该随机数)。
  • 现在客户端和服务端都拥有三个随机数:Client Random、Server Random 和 Pre-Master。用这三个随机数,可以生成加密会话的主密钥(对称密钥)。
  • 有了会话密钥之后,客户端发消息告诉服务端,后面可以该用对称算法通信了,并且在消息中附上了之前数据的摘要(加密之后的)。
  • 服务端收到之后解密验证,同样发消息给客户端,没问题,后面就用对称算法了,也在消息中附上了之前数据的摘要(加密之后的)。

整个握手过程结束,之后就可以收发被对称算法加密的HTTP请求和响应了。

注意,以上握手过程使用ECDHE算法,是目前主流的TLS握手过程。与RAS握手略有不同,即交换密钥的操作是通过交换随机数计算出来的,而并用传统的方法,发送使用公钥加密的pre-master。

以下是使用RAS算法的传统握手方式:

以上的通信其实都只采用了单向认证,即只认证了服务端的身份。这是因为客户端的身份通常可以通过账号密码、key值信息来证明。

注意:以上内容全部来自于罗剑锋老师关于HTTP的课程,属于个人学习笔记,切勿用做商业用途。

发表回复

常枳
近期评论
分类