HTTPS 协议 之TLS连接过程解析

混到现在,拿得起放得下的,只有筷子。

 

HTTPS建立连接

当你在浏览器地址栏里键入“https”开头的URI,再按下回车,浏览器首先要从URI里提取出协议名和域名。因为协议名是“https”,所以浏览器就知道了端口号是默认的443,它再用DNS解析域名,得到目标的IP地址,然后就可以使用三次握手与网站建立TCP连接了。
在HTTP协议里,建立连接后,浏览器会立即发送请求报文。但现在是HTTPS协议,它需要再用另外一个“握手”过程,在TCP上建立安全连接,之后才是收发HTTP报文。
这个“握手”过程与TCP有些类似,是HTTPS和TLS协议里最重要、最核心的部分,懂了它,你就可以自豪地说自己“掌握了HTTPS”。

 

TLS协议的组成

  1. 记录协议(Record Protocol)规定了TLS收发数据的基本单位:记录(record)。它有点像是TCP里的segment,所有的其他子协议都需要通过记录协议发出。但多个记录数据可以在一个TCP包里一次性发出,也并不需要像TCP那样返回ACK。
  2. 警报协议(Alert Protocol)的职责是向对方发出警报信息,有点像是HTTP协议里的状态码。比如,protocol_version就是不支持旧版本,bad_certificate就是证书有问题,收到警报后另一方可以选择继续,也可以立即终止连接。
  3. 握手协议(Handshake Protocol)是TLS里最复杂的子协议,要比TCP的SYN/ACK复杂的多,浏览器和服务器会在握手过程中协商TLS版本号、随机数、密码套件等信息,然后交换证书和密钥参数,最终双方协商得到会话密钥,用于后续的混合加密系统。
  4. 变更密码规范协议(Change Cipher Spec Protocol),它非常简单,就是一个“通知”,告诉对方,后续的数据都将使用加密保护。那么反过来,在它之前,数据都是明文的。

下面的这张图简要地描述了TLS的握手过程,其中每一个“框”都是一个记录,多个记录组合成一个TCP包发送。所以,最多经过两次消息往返(4个消息)就可以完成握手,然后就可以在安全的通信环境里发送HTTP报文,实现HTTPS协议。

RSA握手过程

第一个,使用ECDHE实现密钥交换,而不是RSA,所以会在服务器端发出“Server Key Exchange”消息。

第二个,因为使用了ECDHE,客户端可以不用等到服务器发回“Finished”确认握手完毕,立即就发出HTTP报文,省去了一个消息往返的时间浪费。这个叫“TLS False Start”,意思就是“抢跑”,和“TCP Fast Open”有点像,都是不等连接完全建立就提前发应用数据,提高传输的效率。

 

大体的流程没有变,只是“Pre-Master”不再需要用算法生成,而是客户端直接生成随机数,然后用服务器的公钥加密,通过“Client Key Exchange”消息发给服务器。服务器再用私钥解密,这样双方也实现了共享三个随机数,就可以生成主密钥。

 

双向认证

为了防止账号、密码被盗,有的时候(比如网上银行)还会使用U盾给用户颁发客户端证书,实现“双向认证”,这样会更加安全。
双向认证的流程也没有太多变化,只是在“Server Hello Done”之后,“Client Key Exchange”之前,客户端要发送“Client Certificate”消息,服务器收到后也把证书链走一遍,验证客户端的身份。

 

posted @ 2021-12-14 08:58  方达达  阅读(197)  评论(0编辑  收藏  举报