TLSv1.3学习

TLSv1.3于2018年8月正式发布最终版本。

如果想要浏览基于TLSv1.3的网页,需要浏览器支持,chrome的话需要打开chrome://flags/搜索tls并选择启用。浏览网页时打开开发者调试工具查看Security页签可以观察到网站使用TLSv1.2还是1.3。现在大部分网站还是使用TLSv1.2的,也有少部分使用TLSv1.3的网站的,如https://boke112.com/bkwd/5792.html。

TLSv1.3协议了解

参考资料:

  • rfc文档
  • https://blog.csdn.net/mrpre/article/details/81532469
  • wireshark抓包分析
    (1)必须使用新版的wireshark,否则不支持TLS1.3;
    (2)由于hello后的包就进行了加密,需要配置环境变量SSLKEYLOGFILE,wireshark配置pre master key log file,使用firefox访问目标网页,即可看到解密后的包。

TLSv1.3完整的流程
TLSv1.3学习_第1张图片
第一步,客户端发送Hello,这里面主要包含了
(1)supported groups(支持的key exchange算法及参数)和key_share(根据支持的算法预先算出的pub key),用于计算pre master key。
(2)random,用于最终生成master key。
(3)cipher suites,可选择的套件,用于后面对称加密以及生成摘要。
(4)pre shared key和psk_key_exchange_modes,用于恢复TLS会话。
第二步,服务端从预先计算的pub key中选择一个,同时将自己的random和pub key也返回给客户端,此时服务器已经可以算出master key,所以开始使用密钥进行加密,从change cipher spec往后服务端发送的包都进行了加密。
第三步,服务端发送一些扩展参数
第四步,服务端发送自己的证书,以及针对握手信息计算摘要并使用证书的私钥进行加密,也就是Certificate Verify消息,保证自己拥有证书的私钥。
第五步,服务端针对所有握手信息进行摘要并使用master key进行加密,以验证握手信息的完整和master key的正确。
第六步,客户端也计算出master key,开始加密传输。

New Session Ticket是在握手后服务端随时发送给客户端的,用于快速恢复TLS会话。

总的来说,由于提前计算好pub key,避免了TLS1.2中额外的key exchange消息,所以只需要1-RTT就可以完成了握手。

除了完整的握手以外,还可以使用PSK恢复会话,需要1-RTT或者0-RTT。
1-RTT:服务端需要支持PSK恢复会话,客户端Hello时携带上次连接中的PSK,则可以省去服务器证书的验证过程。
0-RTT:服务端需要支持PSK和Early data,客户端在Hello的同时可以发送Early Data,Early Data是根据PSK加密的,在握手完毕后,客户端会发送End of Early data,开始用密钥进行加密传输。这样节省了1-RTT,但是也没有这么安全。

netty搭建TLSv1.3的服务器

关于TLSv1.2的方法具体在https://blog.csdn.net/lblblblblzdx/article/details/88656951中介绍过了,那么如果使用TLSv1.3需要注意什么呢
(1)由于TLSv1.3比较新,所以需要使用较新版本的netty和jdk才支持,我使用的是4.1.24.Final的netty,和jdk11。
(2)获取SslContext的代码

List<String> ciphers = new ArrayList<String>();
ciphers.add("TLS_AES_128_GCM_SHA256");
ciphers.add("TLS_AES_256_GCM_SHA384");
SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile).trustManager(rootFile)
.protocols("TLSv1.3").ciphers(ciphers).clientAuth(ClientAuth.NONE).build();
  • 默认的协议是TLSv1.2,需要手动配置为TLSv1.3
  • 默认的加密套件都是TLSv1.2的,需手动添加TLSv1.3的加密套件

你可能感兴趣的:(网络协议)