23 TLS 1.3 新特性

Posted by CodingWithAlice on April 29, 2021

23 TLS 1.3 新特性

  • 总结

    1、为了兼容 1.1、1.2 等老协议,TLS1.3 会 伪装 成 TLS1.2,新特性在 扩展 里实现

    2、1.1、1.2 在实践中发现了很多安全隐患,所以 TLS1.3 大幅度 删减了加密算法,只保留了 ECDHE、AES、ChaCha20、SHA-2 等极少数算法,强化了安全;

    3、TLS1.3 也 简化了握手过程,完全握手只需要一个消息往返,提升了性能

三个主要改进目标

TLS1.2 - 2008 年出现,在性能和安全上缺陷

TLS1.3 的三个主要改进目标:兼容、安全与性能

  • 最大化兼容性

    保持现有的记录格式不变,通过 伪装TLS1.2 来实现兼容;在记录末尾添加一系列的 扩展字段 来增加新的功能

    【区分:只要是 TLS1.3 协议,握手的 Hello 消息后面就必须有 supported_versions 扩展,它标记了 TLS 的版本号】

  • 强化安全

    修补了加密算法的弱点不安全因素

    1、伪随机数函数由 PRF 升级为 HKDF

    2、明确禁止在记录协议里使用压缩

    3、废除了 RC4、DES 对称加密算法

    4、废除了 ECB、CBC 等传统分组模式

    5、废除了 MD5、SHA1、SHA-224 摘要算法

    6、废除了 RSA、DH 密钥交换算法和许多命名曲线

算法精简后,TLS1.3 里只有 5 个套件

image-20210429135029349

  • 提升性能

    TLS1.2 中的握手,多花两个消息往返(2-RTT),甚至更长时间的延迟

    因为密码套件大幅度简化 – TLS1.3 压缩了以前的 Hello 协商过程,删除了 Key Exchange 消息,把握手时间减少到了 1-RTT

TLS1.2 和TLS 1.3的握手对比

image-20210429135128493

解析:

客户端Client Hello 息里直接用 supported_groups 带上支持的曲线,比如 P-256、x25519,用 key_share 带上曲线对应的客户端公钥参数,用 signature_algorithms 带上签名算法。

服务器 收到后在这些扩展里选定一个曲线和参数,再用key_share扩展返回服务器这边的公钥参数,就实现了双方的密钥交换,后面的流程就和 1.2 基本一样了。

可以看下抓包:

image-20210429135229579

分析:

1、客户端发出:可以关注下扩展

image-20210429135301185

2、服务器返回:

image-20210429135327930

– 客户端和服务器就拿到了四个共享信息:Client RandomServer RandomClient ParamsServer Params,两边就可以各自用 ECDHE 算出Pre-Master,再用 HKDF 生成主密钥Master Secret

3、算出主密钥后,服务器立刻发出Change Cipher Spec消息,比 TLS1.2 提早进入加密通信,后面的证书等就都是加密的了,减少了握手时的明文信息泄露

4、比TLS1.2多一个Certificate Verify:用服务器的私钥把前面的曲线、套件、参数等握手数据加了签名,强化了身份认证和和防窜改