技术解析

尝试给 NGINX 编译 TLS 1.3 支持时踩到的一个命名坑
0
2021-05-20 19:35:45
idczone

因为目前 TLS 1.3 还没有正式发布,因此本文中描述的情况只适用于此时此刻:2018 年 5 月中旬。

目前 Chrome 支持的是 draft-23,这个版本里的 TLS 1.3 相关的 cipher 名字是:

  • TLS13-AES-256-GCM-SHA384
  • TLS13-CHACHA20-POLY1305-SHA256
  • TLS13-AES-128-GCM-SHA256
  • TLS13-AES-128-CCM-8-SHA256
  • TLS13-AES-128-CCM国外服务器-SHA256

这些值也就是你需要在 NGINX 配置文件的 ssl_ciphers 里加入的。

但是,在目前最新的 OpenSSL 1.1.1-pre6 里,TLS 1.3 相关的 ciphers 的名字变成了:

  • TLS_AES_256_GCM_SHA384
  • TLS_CHACHA20_POLY1305_SHA256
  • TLS_AES_128_GCM_SHA256

所以,目前如果用 NGINX 配合 OpenSSL 1.1.1-pre6 编译来打开 TLS 1.3 支持的话,即使 NGINX 上的配置完全正确,那么可能会要么无法获得 TLS 1.3 (降级到 1.2 且有 1.2 的 cipher 可用),要么直接看到 ERR_SSL_VERSION_OR_CIPHER_MISMATCH (如果只配置了 TLS 1.3 的 cipher 进行测试的话)。

所以结论是,目前( 2018 年 5 月)如果用 OpenSSL 1.1.1-pre6 编译的话,应该是暂时还没有浏览器支持。


OpenSSL 开发组关于 TLS 1.3 支持的一些说明:

https://www.openssl.org/blog/blog/2018/02/08/tlsv1.3/


tlswg wiki 上说 openssl 是 28 了

https://trac.nginx.org/nginx/ticket/1533
https://trac.nginx.org/nginx/ticket/1529
nginx 方面的态度貌似是 wontfix

我用的 pre2

可以看一下这个帖子 /t/445216。
我自己编译的 nginx 是可以用夜夜版 FF 跑通的。
https://g.x86.men/root/nginx-compiler/src/branch/master/stretch-tls13/Dockerfile
加注了 ssl_ciphers 调用 SSL_CTX_set_ciphersuites() 的补丁。

Openssl 主线是 28 没错,浏览器稳定本应该都是 23,Chrome Dev 现在跑的应该是 26,金丝雀不清楚。FF Nightly 一个月前支持的 28。

Canary 目前也是 23

在推上看到 Canary 昨天到 28 了。

看一下这个 Openssl 补丁,挺好用的
https://github.com/hakasenyang/openssl-patch/
用_ciphers 的补丁就可以在 nginx 里设置 TLS1.3 的 CipherSuite 了
更好的是还能支持等价加密算法组!
我的 nginx 配置是
ssl_ciphers "[TLS_AES_128_GCM_SHA256|TLS_CHACHA20_POLY1305_SHA256]:[TLS_AES_256_GCM_SHA384|TLS_AES_128_CCM_8_SHA256|TLS_AES_128_CCM_SHA256]:[ECDHE-ECDSA-CHACHA20-POLY1305|ECDHE-ECDSA-AES128-GCM-SHA256|ECDHE-RSA-CHACHA20-POLY1305|ECDHE-RSA-AES128-GCM-SHA256|DHE-RSA-CHACHA20-POLY1305]:[ECDHE-ECDSA-AES256-GCM-SHA384|ECDHE-RSA-AES256-GCM-SHA384]:[ECDHE-ECDSA-AES128-SHA|ECDHE-RSA-AES128-SHA]:[ECDHE-ECDSA-AES256-SHA|ECDHE-RSA-AES256-SHA]:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA";
前面的几个"TLS_"开头的就是 TLS1.3 的 CipherSuite

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服