在互联网上,SSL/TLS是web服务器和其用户之间可以接受的安全连接解决方案,而你可能至今还没意识到自己每天都在使用SSL。如果你看到HTTPS字样和/或浏览器地址栏的挂锁图标,那么你和网站之间的安全连接就是由SSL/TLS建立的。
过去几年中,作为对用户安全关注的一部分,SSL/TLS得到了公众和IT行业更多的注意。去年,被SSL/TLS加密的互联网通信量第一次超过50%。但很多人仍不知道SSL/TLS是如何工作的。
SSL/TLS协议最重要的一部分就是SSL握手。握手在每次连接开始时发生,也是建立SSL/TLS技术的基础所在。
为了便于理解SSL握手的过程,我们写了两个说明。下一节用最少的术语解释了握手的原理。另外一节更深入地阐述了握手的工作机制。
“握手”是建立一个HTTPS连接过程的专业术语。涉及SSL/TLS的大部分困难工作都在此步完成。
一个HTTPS连接涉及两方:客户端(发起连接的一方,通常是你的浏览器)和服务器。另一方就是“握手”的人。SSL握手的目的是实施一个安全连接所需的所有加密工作。这包括SSL证书使用的验证以及生成一个密钥。
由于达成这一目的的每一个步骤所用到的软件都是不同的,握手的第一步就是让客户端和服务器共用彼此的性能,以发现他们共同支持的加密功能。浏览器是最常见的客户端,而诸如Chrome、火狐、IE等不同浏览器的功能也互不相同。类似地,在服务器端,诸如Windows Server、Apache、NGINX等常见操作系统也有着不同的性能支持。
一旦客户端和服务器在他们使用的具体加密方法上达成一致,服务器就会向客户端发送它的SSL证书。客户端会检验以确认证书是“可信的”,这是一个极其重要的步骤。为真正建立一个安全连接,你不能只是加密你的数据,还要确保数据被发送到正确的人或地点。SSL证书提供了这种保证。
SSL证书是由证书颁发机构(CA)创建并签发的,这种机构是被批准颁发证书的公司。你可能知道其中一些比较著名的机构,如 Symantec和Comodo。CA遵守行业标准,确保你只能得到你真正拥有的网站或公司的证书。
在握手期间,客户端将进行加密安全检验来确保服务器提供的证书是可信的。这包括检验数字签名并确保证书来自于一个可信的CA。
客户端也会得到服务器拥有与此证书相关的私钥的证明。所有SSL证书都包含一对密钥,密匙由一个公钥和一个私钥组成。公钥用于加密数据,私钥则用于解密。这称为“不对称”加密,因为两个功能由不同的密钥来执行。
就最常见的密钥类型RSA来说,客户端会以公钥加密随机数据,用该公钥生成会话密钥。只有当服务器有私钥提供所有权证明的情况下,才能解密并使用该数据。如果使用另一类型的密钥,这个过程就变了,但总是需要检验所有权证明的。
握手的最后一部分涉及创建“会话密钥”,这实际上是用于安全通信的密钥。会话密钥是“对称”的,也就是说相同的密钥既用于加密也用于解密。这样的密钥能实现强加密性,其有效性大大超过不对称密钥,这使得它们适于在HTTPS连接中来回发送数据。
为结束握手,每一方都要使对方知道他们完成了所有必要的工作,然后双方都进行检验以确保握手过程中没有任何恶意篡改和破坏。整个握手发生在几百毫秒时间内。它是HTTPS连接中必须发生的第一件事,甚至要早于网页的加载。
一旦握手完成,已加密和验证过的HTTPS连接就开始了,所有在你和服务器之间被发送和接收的数据都受到保护。每次你重新访问一个网站的时候,握手都将重复发生。为了实现更高的效率和速度,很多服务器会执行一个“继续”过程。
握手包含一系列步骤,完成三个主要任务,我们将其概括为:交换加密功能、验证SSL证书和交换/生成会话密钥。注意,在即将到来的TLS1.3中,握手设计发生了变化,因此这些步骤不适用于TLS1.3。
下图阐释了这些步骤,左侧是客户端,右侧是服务器。每一步都有箭头标识出接收消息的一方。
在这几步完成后,SSL握手就完成了。双方现在有了一个会话密钥并开始以一个加密的和验证过的连接进行通信。从这时起,“应用”数据(属于实际服务的数据,也就是网站的HTML、Javascript等)的第一个字节可以被发送了。