记录一下 TLS1.3 的加密过程,如何协商会话秘钥
TLS 就是 HTTPS 的那一层加密协议,前身是SSL,但是现在SSL已经淘汰了。之前用wireshark 抓包看,现在的网站多是TLS1.2。
这层协议的主要流程大概是双方先通过非对称协商握手,得出一个对称密钥,然后再通过这个对称密钥加密进行通信。
官方说明文档:
(有亿点复杂,麻了,想要知道细节的话就去看文档吧,160页的论文)
一. 与 TLS 1.2 的主要区别
- 对称加密算法换成带有关联数据的经过身份验证的加密 (AEAD) 算法。可以理解为他将完整性和机密性结合了?
- 静态 RSA 和 Diffie-Hellman 密码套件已被删除。所有基于公钥的密钥交换机制现在都提供前向保密。
- 重新设计了密钥派生函数:使用基于HMAC的提取和扩展密钥派生函数 (HKDF) 。
- TLS 1.2 版本协商机制已被弃用,TLS1.3和1.2不能兼容。
二. 协议概述
1.TLS 支持三种基本密钥交换模式
- (EC)DHE (Diffie-Hellman over either finite fields or elliptic curves)
- PSK-only
- PSK with (EC)DHE
2. 完整 TLS 握手
3. 握手有三个阶段
- Key Exchange(密钥交换):建立共享密钥材料并选择加密参数。此阶段之后的所有内容均已加密。
- Server Parameters(服务器参数):建立其他握手参数(客户端是否认证,应用层协议支持等)。
- Authentication(身份验证):验证服务器(以及可选的客户端)并提供密钥确认和握手完整性。
由ClientHello 和 ServerHello 协商的密钥材料生成最后的共享密钥。
(EC)DHE and PSK,这两个密钥建立方法,可以单个使用,也可以同时。应该是由客户端选择的,客户端在ClientHello中添加相应的拓展字段。(TLS 1.3 ClientHello 消息总是包含扩展(至少是“supported_versions”,否则,它们会被解释为TLS 1.2ClientHello 消息)
ClientHello中有
- offered protocol versions:a list of symmetric cipher/HKDF hash pairs.
- Diffie-Hellman key shares (in the “key_share” extension) 或者 pre-shared key labels (in the “pre_shared_key” extension),也可以两者都有。
三. 密钥生成
密钥派生过程使用了为 HKDF [ RFC5869 ] 定义的 HKDF-Extract 和 HKDF-Expand 函数。
输入密钥材料 (IKM),通过 HKDF 生成最终密钥。
输入的两个参数:
- PSK (a pre-shared key established externally or derived from the
resumption_master_secret value from a previous connection) - (EC)DHE shared secret
四. 密码套件 CipherSuite
对称密码套件定义了一对 AEAD算法和哈希算法,以与 HKDF 一起使用。
- TLS_AES_256_GCM_SHA384
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256
- TLS_AES_128_CCM_8_SHA256
- TLS_AES_128_CCM_SHA256
例如:TLS_AES_128_CCM_SHA256
AES-CCM (AES-CTR + CBC-MAC,128-bit) (a AEAD algorithm),
SHA256 is the hash function used in HKDF.