安全通信协议是一类用于保护计算机网络上数据传输安全的协议。这些协议通过加密、身份验证和数据完整性机制来防止数据被窃听、篡改或伪造。以下是一些主要的安全通信协议:SSL/TLS, IPsec, SSH, HTTPS, PGP/GPG, DTLS, S/MIME
以下我们着重介绍SSL/TLS和HTTPS
SSL/TLS
SSL:Secure Socket Layer(安全套接层) 是用于两个通信应用程序之间提供安全连接的协议,目前SSL证书均已停用
TLS:Transport Layer Security (传输层安全协议),是SSL的升级版本,用于修复SSL安全漏洞,虽然TLS被广泛使用,但依然沿用SSL称呼
TLS历史发展
SSL1.0(1995年) 存在严重漏洞,未被公开发布
SSL2.0(1995) 首次公开发布版本,存在漏洞,如不完全的握手和容易遭受攻击
SSL3.0(1996) 易受POODLE攻击,已被认为不安全协议
TLS1.0(1999) 受BEAST攻击,逐渐被弃用
TLS1.1(2006) 增强了CBC模式保护,防止了某些攻击, 但目前逐渐被更新版本取代
TLS1.2(2008) 引入了更多加密算法支持,改进了密钥导出和签名计算方式,更加灵活安全,目前依然广泛使用,被认为是安全的
TLS1.3(2018) 大幅简化了握手过程,减少了延迟,引入了前向保密性(Forward Secrecy)作为默认特性,是目前的最新版本,广泛推行和应用
层次结构
SSL/TLS协议由多个子协议构成,每个子协议负责不同的功能
- 握手协议(Handshake Protocol)
- 负责建立和管理安全连接,包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
- 记录协议(Record Protocol)
- 负责数据分片、压缩、加密和传输,确保数据的机密性和完整性。
- 警报协议(Alert Protocol)
- 对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告。
- 变化密码规范协议(Change Cipher Spec Protocol)
- 用于通知对方使用新的加密算法和密钥,一条消息表明握手协议已经完成。
SSL/TLS握手协议
SSL/TLS协议能够提供的安全目标主要包括如下几个:
- 认证性——借助数字证书认证服务器端和客户端身份,防止身份伪造
- 机密性——借助加密防止第三方窃听
- 完整性——借助消息认证码(MAC)保障数据完整性,防止消息篡改
- 重放保护——通过使用隐式序列号防止重放攻击
为了实现这些安全目标,SSL/TLS协议被设计为一个两阶段协议,分为握手阶段和应用阶段
- 客户端 Hello(ClientHello)[人话版:Client:我能理解的cipher suit有RSA/3DES等,我们使用什么cipher suit进行通信]
- 客户端发送
ClientHello
消息,其中包含:- 支持的协议版本(如 TLS 1.2)
- 支持的加密套件列表
- 支持的压缩方法
- 随机数
- 其他扩展(如服务器名称指示 SNI)
- 客户端发送
- 服务器 Hello(ServerHello)[人话版:Server: 我们就用RSA/3DES进行通信吧]
- 服务器响应
ServerHello
消息,其中包含:- 协议版本(如 TLS 1.2)
- 选择的加密套件
- 选择的压缩方法
- 随机数
- 其他扩展
- 服务器响应
- 服务器证书(Server Certificate)[人话版:Server: 这是我的身份证明,你看看]
- 服务器发送其数字证书,包含公钥,客户端用来验证服务器的身份。
- 服务器密钥交换(Server Key Exchange 可选)[人话版:Server: 如果证书信息不足的话,我们使用这些信息来进行密钥交换吧]
- 如果使用临时密钥交换算法(如 ECDHE 或 DHE),服务器发送密钥交换消息。
- 服务器证书请求(Server Certificate Request, 可选)[人话版:Server: 对了,也给我下你的身份证明吧]
- 如果需要客户端身份验证,服务器请求客户端证书。
- 服务器握手结束(Server Hello Done)[人话版:Server: 问候到此结束]
- 服务器发送
ServerHelloDone
消息,表示握手消息结束。
- 服务器发送
- 客户端证书(Client Certificate, 可选)[人话版:client: 给你我的证书]
- 如果服务器请求,客户端发送其数字证书。
- 客户端密钥交换(Client Key Exchange)[人话版:client: 这是经过你的公钥加密后的预备主密码]
- 客户端生成预主密钥,用服务器的公钥加密后发送给服务器, 预主密钥用于生成最终的会话密钥。
- 服务端收到预主密钥后,会使用其私钥解密,客户端和服务器使用预主密钥和随机数生成主密钥,再派生出会话密钥。
- 证书验证(Certificate Verify, 可选)[人话版:client: 我就是持有客户端证书本人]
- 如果客户端发送了证书,客户端发送此消息以证明其身份。
- 客户端更改密码规范(Client ChangeCipherSpec)[人话版:Client: 好的,我现在切换为我们协商好的密码进行后续通信]
- 客户端发送
ChangeCipherSpec
消息,表示后续通信将使用协商好的加密算法和会话密钥。
- 客户端发送
- 客户端完成(Client Finished)[人话版:client: 握手协议到此结束]
- 客户端发送
Finished
消息,包含握手过程的摘要,使用会话密钥加密。
- 客户端发送
- 服务器更改密码规范(Server ChangeCipherSpec)[人话版:server: 好的,我也要切换密码了]
- 服务器发送
ChangeCipherSpec
消息,表示后续通信将使用协商好的加密算法和会话密钥。
- 服务器发送
- 服务器完成(Server Finished)[人话版:server: 好的,握手协议到此结束]
- 服务器发送
Finished
消息,包含握手过程的摘要,使用会话密钥加密。
- 服务器发送
TLS1.3对握手过程进行了简化,减少了消息数量,整个握手过程如下
- 客户端 Hello(ClientHello)
- 客户端发送
ClientHello
消息,其中包含:- 支持的协议版本(如 TLS 1.3)
- 支持的加密套件列表
- 支持的密钥共享方法(如 ECDHE)
- 支持的签名算法
- 支持的哈希算法
- 随机数
- 其他扩展(如服务器名称指示 SNI)
- 客户端发送
- 服务器 Hello(ServerHello)
- 服务器响应
ServerHello
消息,其中包含:- 协议版本(如 TLS 1.3)
- 选择的加密套件
- 选择的密钥共享方法
- 随机数
- 其他扩展
- 服务器响应
- 服务器证书(Server Certificate)
- 服务器发送其数字证书,包含公钥,客户端用来验证服务器的身份。
- 服务器证书验证(Certificate Verify)
- 服务器发送证书验证消息,使用服务器的私钥对握手消息签名,证明其身份。
- 服务器握手完成(Server Finished)
- 服务器发送
Finished
消息,包含握手过程的摘要,使用会话密钥加密。
- 服务器发送
- 客户端证书(Client Certificate, 可选)
- 如果服务器请求,客户端发送其数字证书。
- 客户端证书验证(Certificate Verify)
- 客户端发送证书验证消息,使用客户端的私钥对握手消息签名,证明其身份。
- 客户端握手完成(Client Finished)
- 客户端发送
Finished
消息,包含握手过程的摘要,使用会话密钥加密。
- 客户端发送
TLS1.2 Vs TLS1.3
由上述握手过程可以看出,TLS1.3的握手过程比TLS1.2的握手过程简洁了不少,握手过程是两者的关键区别
-
Difference 1:往返时间(RTT)
往返时间 (RTT) 是指信号从发送端到接收端再返回所需的时间。 在 TLS 等协议中,RTT 至关重要,因为它直接影响用户浏览器和网站服务器建立安全连接的速度。
在 TLS 1.2 中,当浏览器连接到安全网站时,握手过程需要在客户端(浏览器)和服务器之间往返两次,然后才能开始安全地交换数据。
TLS 1.2 中的两步握手会带来延迟,尤其是在客户端和服务器之间距离较远的情况下,延迟会更明显
TLS 1.3号称 0-RTT, 通过合并客户端和服务端的 “Hello”信息,将客户端与服务端之间的往返次数从两次减少到了一次。
-
Difference 2:密码套件(Cipher suit)
TLS 1.2 支持多种密码套件,提供各种加密、身份验证和散列算法组合。 但是,选择的丰富性增加了选择安全性较低的密码套件的风险,可能会使通信暴露于漏洞之中
TLS 1.3 将支持的密码套件缩减到五个,全部基于关联数据验证加密(AEAD)原理。 这种简化旨在提高安全性和效率。
LS 1.3 中受限但安全的密码套件选项降低了协商的复杂性,减少了无意中使用弱加密算法的可能性。
-
Difference 3:完美的前向保密(PFS)
完美前向保密(PFS)是一种加密功能,旨在防止在长期密钥泄露的情况下暴露过去的通信。
TLS 1.3 默认启用完美前向保密(PFS)。 这意味着,即使有人设法窃取了您安全通信所用的密钥,他们也无法解密过去的信息。 这就像定期更换门锁一样。
目前,在 TLS 1.2 中,使用这种额外的安全功能是可选的。 因此,如果您没有特别选择,如果有人掌握了您的秘钥,他们就有可能解密并读取您以前的信息。
从本质上讲,TLS 1.3 可确保您过去的数据传输无论如何都不会被锁定,与 TLS 1.2 相比提供了更高的安全级别。
-
Difference 4:密钥交换机制
TLS 1.2 使用多种密钥交换方法,包括RSA(Rivest-Shamir-Adleman)和 Diffie-Hellman 方法。 RSA 包括服务器向客户端发送加密的预主密文,而 Diffie-Hellman 允许客户端和服务器通过开放信道建立共享密文。 不过,TLS 1.2 通常默认使用 RSA 进行密钥交换。
现在,在 TLS 1.3 中,默认密钥交换机制发生了明显的变化。 该协议要求使用 Diffie-Hellman 密钥交换,特别是椭圆曲线变体 (ECDHE)。 这种方法可确保更高效、更安全地协商加密密钥。