TLS握手过程逐步详解

浏览器地址栏上的每一个小锁图标背后,都发生过一次在真正数据传输之前、以毫秒级速度完成的握手过程。

HTTPS与TLS的关系

HTTPS就是经过TLS(传输层安全协议)加密的普通HTTP流量。在传输任何实际数据之前,浏览器和服务器会先完成一次称为"TLS握手"的协商过程,安全地约定好之后用来加密所有通信的密钥。

第一步:ClientHello

浏览器首先发送一条ClientHello消息,其中包含自己支持的TLS版本、密码套件(加密方式)列表以及一个随机数,以此向服务器提议通信方式。

第二步:ServerHello与证书出示

服务器从浏览器提议的选项中挑选一种,通过ServerHello作出回应,同时发送自己的SSL/TLS证书,以证明自己就是它所声称的那个网站。

第三步:密钥交换与会话密钥生成

浏览器验证证书之后,双方使用非对称(公钥)加密方式安全地交换必要的数值,再各自独立计算出同一个对称密钥,即之后实际用于加密通信的会话密钥。

第四步:Finished消息与加密通信开始

双方会交换一条"Finished"消息,确认此前交换的信息在传输过程中未被篡改。从这一刻起,后续所有数据都会使用刚刚生成的会话密钥进行加密传输。

TLS 1.3比TLS 1.2快在哪里

早期版本TLS 1.2完成一次握手需要两次完整的往返通信(2-RTT),而TLS 1.3简化了协商步骤,只需一次往返(1-RTT)即可完成握手,重新连接时甚至可以做到零往返(0-RTT),连接速度更快。

为什么握手过程会在加载数据之前发生

整个协商过程都发生在浏览器真正请求网页内容之前,这也是为什么证书过期、不支持的密码套件或网络问题导致握手变慢或失败时,即便服务器本身运行正常,网站也可能无法打开。浏览器提示"连接不安全"之类的警告,几乎总是握手阶段出了问题,而不是网页内容本身的问题。

一次握手中同时用到的公钥加密与对称加密

握手过程实际上用了两种不同的加密技术来完成两种不同的任务:先用速度较慢但安全性更高的非对称(公钥)加密,在不被窃听的前提下安全地交换初始密钥;然后用速度更快的对称加密,配合刚刚生成的会话密钥来处理实际的数据传输——因为对称加密处理普通网页会话中大量数据时效率要高得多。

常见问题

为什么TLS 1.3比TLS 1.2少了一次往返?

TLS 1.3简化了握手流程,让客户端一开始就直接提出具体的密钥交换方式,服务器可以一次性返回完成握手所需的全部信息,从而把原本需要两次往返的过程缩短为一次。

握手更快真的会让网页加载速度有明显区别吗?

会,尤其是在移动网络这类延迟较高的连接环境下——一次完整往返可能需要几十到几百毫秒不等,把握手从两次往返减少到一次(重新连接时甚至为零次),能够明显缩短安全页面开始加载所需的时间。