TLS(传输层安全)是一种用于在不安全网络上实现安全通信的协议。它的前身是SSL(安全套接层)。TLS通过一系列握手和消息交换过程来建立一个安全的通信通道。以下是TLS握手的基本步骤:
TLS 握手过程:
1. 客户端Hello(ClientHello): 客户端向服务器发送一个`ClientHello`消息,该消息包含以下信息:
- TLS版本
- 支持的密码套件(Cipher Suites)
- 随机数(Client Random)
- 可选的会话ID(用于会话恢复)
2. 服务器Hello(ServerHello): 服务器收到ClientHello后,选择一个客户端和服务器都支持的密码套件和TLS版本,并发送ServerHello消息。该消息包含:
- 选定的TLS版本
- 选定的密码套件
- 随机数(Server Random)
3. 服务器证书(Server Certificate): 服务器发送其数字证书,以便客户端可以验证服务器的身份。
4. 密钥交换(Key Exchange): 服务器可能会发送一个密钥交换消息(取决于选定的密码套件)。这通常用于设置预主密钥(Pre-Master Secret)。(为了让客户端将生成的预主密钥加密,所以先把公钥传给客户端,就是这个过程)
在密钥交换过程中,服务器的角色取决于所使用的密钥交换算法,甚至有些算法可能没有这个过程,例如RSA。以下是几种常见的密钥交换方法:
Diffie-Hellman(DH)或椭圆曲线Diffie-Hellman(ECDH):
① 参数和公钥发送(ServerKeyExchange): 服务器发送Diffie-Hellman参数(对于DH)或椭圆曲线参数(对于ECDH)以及其公钥。
DHE(动态Diffie-Hellman)或ECDHE(椭圆曲线动态Diffie-Hellman):② 参数和公钥发送(ServerKeyExchange): 服务器发送新生成的Diffie-Hellman或椭圆曲线参数以及公钥。
5. 服务器Hello完成(ServerHelloDone): 服务器发送一个ServerHelloDone消息,表示它已完成握手消息的发送。
6. 客户端密钥交换(Client Key Exchange): 客户端发送一个密钥交换消息,该消息包含预主密钥或足够的信息以便服务器能推导出预主密钥。(预主密钥由客户端生成)
和第4步类似,只不过方向相反,当前是否交换要取决于加密算法,例如RSA:
因为"Certificate"消息包含服务器的数字证书,该证书内嵌有服务器的RSA公钥,所以不用"key exchange" 过程。
客户端密钥交换: 客户端生成一个预主密钥(Pre-Master Secret),并使用服务器发送到客户端的公钥对其进行加密,然后将加密后的预主密钥发送给服务器。这个步骤通常在"ClientKeyExchange"消息中完成。
后续(非客户端密钥交换过程):
服务器解密: 服务器使用其私钥解密这个加密过的预主密钥,从而获得原始的预主密钥。
生成会话密钥: 服务器和客户端都使用这个预主密钥(以及在握手过程中交换的其他随机值)来生成实际用于会话加密的主密钥。
7. 更改密码规格(Change Cipher Spec): 客户端和服务器都发送一个Change Cipher Spec消息,表示之后的通信将使用新协商的加密设置。
更改密码规格的作用:
确认加密设置: 在TLS握手过程中,客户端和服务器会协商一组加密算法和参数(称为“密码套件”)。"Change Cipher Spec"消息表示双方将开始使用这些新协商的设置。
启用加密: 在发送"Change Cipher Spec"消息后,所有后续的通信都将使用新的加密设置。这确保了数据的机密性和完整性。
会话层次: 这一步也标志着新的会话层次的开始,即从这一点开始,双方将使用新的会话密钥进行通信。
信号状态变更: 这个消息本身通常不加密,但它是一个信号,表明后续的消息(如"Finished"消息)将使用新的加密和完整性检查机制。
发送“Change Cipher Spec”消息:一旦双方确认了密码套件和所有必要的密钥材料,它们就会发送一个"Change Cipher Spec"消息。
加密生效:收到"Change Cipher Spec"消息后,双方将开始使用新的加密设置。这通常是通过使用先前协商的预主密钥(Pre-Master Secret)来生成会话密钥,然后使用这些会话密钥来加密和解密数据。
8. 完成(Finished): 客户端和服务器都发送一个Finished消息,该消息使用新的加密设置加密。
9. 应用数据(Application Data): 握手完成后,客户端和服务器就可以安全地交换应用数据。
密钥生成:
- 预主密钥(Pre-Master Secret): 在密钥交换阶段生成或交换。
- 主密钥(Master Secret): 使用预主密钥和两个随机数(Client Random和Server Random)生成。
- 会话密钥(Session Keys): 从主密钥派生出来,用于加密和解密数据。主密钥通常是对称加密算法的密钥,用于加密应用数据。
这只是一个高级概述,TLS握手和密钥交换有多种变体,取决于使用的密码套件和配置。
在TLS(传输层安全)握手过程中,Client Random和Server Random是两个非常重要的随机数,它们有多个用途:
密钥生成:
1. 生成主密钥(Master Secret): Client Random和Server Random与预主密钥(Pre-Master Secret)一起用于生成主密钥。主密钥是对称加密和解密数据的关键。
2. 生成会话密钥(Session Keys): 主密钥进一步用于生成用于加密和解密数据的会话密钥。这些会话密钥也依赖于Client Random和Server Random。
安全性增强
1. 防止重放攻击: 每次握手时都会生成新的Client Random和Server Random,这有助于防止重放攻击。
2. 确保唯一性: Client Random和Server Random的唯一性有助于确保每个TLS会话都是唯一的。
3. 增加熵: 这两个随机数增加了系统的熵(随机性),这是密码系统安全性的关键因素。
协议兼容性
1. 版本协商: 尽管ClientHello和ServerHello消息中包含了协议版本信息,但Client Random和Server Random也可以用于确保双方都在使用相同版本的TLS协议。
总体而言,Client Random和Server Random在确保通信安全、生成密钥和防止各种攻击方面起着至关重要的作用。它们是TLS安全性的基础组成部分。