0x01 前言

TLSv1.3在很久以前就已经起草,直至最近,IETF已经确认了正式版草案,根据计划,将在4月5日发布正式版。

在此之前,Firefox与Chrome已经使用支持Openssl draft 23的中间件启用TLSv1.3。所以在一周以前,我重新编译nginx,提前启用TLSv1.3。

其实nginx从1.13.0开始就已经支持TLSv1.3,但是主流的浏览器还不能自动启用TLSv1.3,所以我一直都没有把这个协议加上,直至上周,我终于动手了。

0x02 准备

因为我应用环境的需要,所以我需要下载以下源码:

  • lua-nginx-module:用于支持lua模块
  • nginx-ct:启用证书透明度
  • openssl-1.1.1-pre2:用于启用TLSv1.3
  • ModSecurity:用于编译ModSecurity
  • ModSecurity-nginx:用于连接ModSecurity与nignx

这里有个要注意的点,目前最新的openssl版本为: openssl-1.1.1-pre3,这个版本的openssl对应draft 26,而我们需要draft 23,对应的openssl版本为 openssl-1.1.1-pre2。旧版本的openssl可以从以下地址下载:

首先建立临时文件夹并下载相关文件:

然后,还得下载nginx:

最后解压被压缩的软件:

最终,该目录下会有这些文件夹:

0x03 编译安装

如果不需要ModSecurity,那么可以跳过ModSecurity的部分,如果需要一起编译,那么请参考以下文章中“0x03.1 Modsecurity Lib”的部分,先准备好ModSecurity,再编译nignx:

如果不想看那么长的文章,也可以直接运行以下命令:

完成ModSecurity的编译安装后就可以准备nignx的编译参数了:

在开始编译之前,需要修改OpenSSL的一个文件,这是一个已知的BUG,而且在新版的OpenSSL中已经修复。打开以下文件并修改:

然后进入nginx源码的文件夹进行编译操作:

因为自定义了OpenSSL版本,所以编译的时间会比较长,需耐心等待。

完成后即可通过以下命令查看nginx的相关信息:

0x04 配置

在启动nginx之前我们需要对站点的配置文件稍作改动。

因为TLSv1.3新加入了几个算法,所以需要添加到nginx的配置文件中:

  • 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

因为我的站点不计划支持旧设备,所以目前只支持TLSv1.2与TLSv1.3。如果你的业务需要支持旧的设备,那么请注意选择加密算法,以下为我站点所使用的算法:

然后配置协议:

其他的配置信息可以参考以下文章:

0x05 测试

在我写这篇文章的时候,最新版本的chrome与Firefox已经默认启用对OpenSSL draft 23的支持,所以并不需要手动修改浏览器的配置。

打开chrome的控制台,选择security标签,再打开测试用的站点,就可以看到所使用的协议:

至于Firefox,打开站点后点击地址栏上的小锁,然后点击“显示连接细节”,最后单击“更多信息”即可看到所使用的协议:

因为能力所限,我并没有测试其他浏览器,如果有需要,请自行测试。

0x06 结语

还有几天,正式版的OpenSSL就要发布了,同时各主流的浏览器也将逐步更新,加入对TLSv1.3的支持。不过对于终端用户来说并没有什么感觉,但我们需要特别关注浏览器对这个协议的兼容性。