在计算机网络的八股问题中,面试官最常问的一个问题就是:“SSL/TLS的握手过程是怎样的”,网络上关于“SSL/TLS握手过程”的文章五花八门,概括的握手过程也各不相同,于是便写篇文章帮助自己理解和回顾,也希望这篇文章可以带你深入理解计算机网络中的SSL/TLS是什么,以及它的握手过程是如何进行的。
1.SSL/TLS是什么?
首先,我们需要搞清楚什么是SSL/TLS。SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是用于在互联网上提供安全通信的加密协议。它们通过在客户端和服务器之间建立加密连接,确保数据在传输过程中不被窃听或篡改。SSL 是 TLS 的前身,TLS 是 SSL 的升级版本,目前 SSL 已被 TLS 取代,但我们通常仍将两者统称为 SSL/TLS。
TLS与SSL的主要区别在于它们的安全特性和标准支持,以下是SSL/TLS的版本迭代:
- SSL 1.0:未公开发布,存在严重安全漏洞。
- SSL 2.0(1995):已废弃,存在安全问题。
- SSL 3.0(1996):已废弃,易受 POODLE 攻击。
- TLS 1.0(1999):基于 SSL 3.0,已逐渐被淘汰。
- TLS 1.1(2006):修复了 TLS 1.0 的部分漏洞,但仍不够安全。
- TLS 1.2(2008):目前广泛使用的版本,安全性较高。
- TLS 1.3(2018):最新版本,简化了握手过程,性能更高,安全性更强。
我们知道,最初的传输协议HTTP是超文本传输协议,信息是明文传输,存在安全风险。为了解决HTTP不安全的缺陷,HTTPS在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输。
因此,我们可以理解为:HTTPS = HTTP + SSL/TLS,HTTP和SSL/TLS共同组成了HTTPS。原本HTTP在TCP三次握手后便可以进行报文传输,而HTTPS在TCP握手后还需要进行TLS/SSL的握手过程才可以进入加密报文传输,这是HTTP和HTTPS最大的一个区别。
当然,SSL/TLS并不是HTTPS专属,除了可以用在HTTPS上,它还有其他应用场景:
- 电子邮件:如 SMTP、POP3、IMAP 协议的加密。
- VPN:用于加密远程访问和数据传输。
- 即时通讯:如 WhatsApp、Signal 等应用的加密通信。
- API 通信:保护客户端与服务器之间的数据传输。
2.SSL/TLS的握手过程
接下来,我们来看SSL/TLS的握手过程。这里我花了不少时间才理解这个握手过程是如何实现报文加密传输的。
在理解SSL/TLS握手过程之前,我们首先需要了解非对称加密算法(如RSA或ECDSA)。该算法生成一对密钥:公钥和私钥。非对称加密的关键在于,它使用两把密钥:
- 公钥:可以公开发送给任何人,主要用于加密信息。
- 私钥:必须保密,仅服务器持有,用于解密由公钥加密的信息。
在了解非对称加密算法后,我们就可以设计出来一个简单的握手过程(非常重要):
- 服务器生成一对密钥,公钥传递给客户端,而密钥留在服务器,并保证不被窃取。
- 然后客户端生成一个协商密钥,并用刚才的公钥加密,传输给服务器。
- 最后服务器用私钥解密客户端传过来的协商密钥
这样,客户端和服务器都得到了相同的协商密钥,就可以用它来加密之后的应用消息了。
了解非对称加密算法后,再来看SSL/TLS详细的握手过程,我根据下面的握手过程绘制了一张时序图,你可以结合时序图一起理解SSL/TLS的握手过程:
(1)客户端发起请求
客户端发起一个"ClientHello"消息,这是一个加密通信请求。这个消息包括以下信息:
- 客户端支持的SSL/TLS协议版本,比如TLS 1.2、TLS 1.3等。
- 客户端支持的加密套件(Cipher Suites)供服务器挑选,,这些加密算法组合用于数据加密和身份验证。常见的有RSA、ECDHE等。
- 一个随机数(Client Random),用于后续生成会话密钥。
(2)服务器响应请求
服务器收到客户端的"ClientHello"消息后,返回"SeverHello"消息,内容包括:
- 服务器选择的SSL/TLS协议版本,必须是客户端支持的版本之一。
- 服务器选择的加密套件,必须是客户端支持的套件之一。
- 服务器生成的随机数(Server Random),用于后续的加密操作。
- 服务器的数字证书(也叫公钥证书),其中包含服务器的公钥以及由权威证书机构(CA)签发的证书链,客户端可以通过该证书验证服务器的身份。
(3)客户端加密报文,计算协商密钥
客户端验证服务器的身份没问题后,会从数字证书中取出服务器的公钥,并用它来加密报文中的内容。报文内容包括:
- 一个随机数(pre-master secret,预主密钥),这个随机数非常重要,会被服务器公钥加密。
- 加密通信算法改变通知,表示随后的信息都将用协商密钥与算法进行加密通信。
- 客户端握手结束通知,表示客户端的握手阶段已经结束。
协商密钥:此时客户端已经获取全部的计算协商密钥需要的信息:两个明文随机数 Client Random 和 Server Random与刚才的 Pre-master secret,即可通过与服务端协商的加密算法来计算得到协商密钥。
enc_key=Fuc(random_C, random_S, Pre-Master)
(4)服务器解密报文,计算协商密钥
服务器首先使用私钥对pre-master secret进行解密,现在服务器也得到两个明文随机数 Client Random 和 Server Random与刚才的 Pre-master secret,再通过加密算法计算即可得到协商密钥。
enc_key=Fuc(random_C, random_S, Pre-Master)
服务器返回报文,报文内容包括:
- 加密通信算法改变通知,表示随后的信息都将用协商密钥与算法进行加密通信。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。
接下来,客户端与服务器进入加密通信,本质上是使用普通的 HTTP 协议,只不过用协商密钥来加密内容。(后面就是对称加密解密的过程了,因为协商密钥已经被安全的“传送”给了通信的双方。)
如果这篇文章对你有帮助,欢迎转发、点赞和评论。