试玩 nginx mainline 1.13 的 TLSv1.3

大晚上的刷推发现 nginx 出了新的大版本更新(https://twitter.com/nginxorg/status/856896480497385473),一看 TLSv1.3 support,顿时吓清醒了,为啥这么厉害的特性官方博客都没一篇说明的(关于 TLS 1.3 的介绍建议阅读微信的 基于TLS1.3的微信安全通信协议mmtls介绍),后来发现原来1.11.x 的时候就偷偷加入的支持然而没有告诉你,我也是十分的无语。仔细看了一下 ngx_http_ssl_module 的文档:

The TLSv1.3 parameter (1.13.0) works only when OpenSSL 1.1.1 built with TLSv1.3 support is used.

OpenSSL 1.1.1,Arch 半天都没敢上1.1.0你跟我说1.1.1,去 OpenSSL 官网一看甚至还没 Release,感觉确实是太 bleeding edge 了不适合拿来用只适合拿来玩。nginx.org 的预编译包的 OpenSSL 版本是跟随对应发行版主源里的版本(非 backport),而非滚动更新发行版里的 OpenSSL 是不会有大版本变动的,比如 Ubuntu 14.04 的 nginx-mainline built with OpenSSL 1.0.1f 6 Jan 2014,而 backport 源里已经有 1.0.2k  26 Jan 2017。

因为 OpenSSL 尚未正式发布1.1.1,因此先从 github 获取开发分支的源码,注意 master 分支的版本是 draft-19,这个版本编译出的 nginx 并不能兼容当前版本浏览器的 TLS1.3(实际测试 Chrome 60访问 build with master branch 的 nginx 不会启用 TLS 1.3 但是也不会出错):

获取当前版本的 nginx 编译参数(mainline 版本预编译包的编译选项是开的很全的,只手动开 --with-openssl,--with-http_ssl_module  这些参数肯定最后用着会踩坑的不是好习惯):

nginx -V 获取当前版本的编译参数,添加  --with-openssl=/path/to/openssl/source --with-openssl-opt=enable-tls1_3 , make -j 进行编译但是不要安装,因为 OpenSSL 1.1.1 是不稳定的版本,在此基础上编译的 nginx 不应用作长期运行,所以不要安装。

查看编译的 nginx 参数:

如果看到输出信息里含有 “built with OpenSSL 1.1.1-dev” 说明至少编译是没有出错的,

修改 nginx.conf,加入 TLSv1.3 参数(实际上1.13版本更新就是更新了这个参数,之前的 nginx 不支持这个参数但是只要写了 TLSv1.2 就会启用1.3):

建议先停止当前 nginx 服务后直接使用 ./objs/nginx -c /etc/nginx/nginx.conf 启动新编译的 nginx。

Chrome 目前也没有默认启用 TLS 1.3,修改 chrome://flags/#ssl-version-max 为 TLS 1.3 保存(chrome 60之后这个选项变成了,设为 draft 即可)。


后记:

从 gist 找到了一个通过修改官方打包脚本的一些参数给 CentOS 下 nginx 添加 ALPN 的脚本,修改了一下用在这里:https://gist.github.com/StarDuster/0d6fb37132fe64c0e7f60631e02b0f0d

rpm 打包的 SPEC 对格式非常严格,编译参数里 --with-openssl=../openssl-1.1.1-tls1.3-draft-18/ 在我手动 configure 的时候没有问题,使用 rpmbuild 的时候就提示 canonicalization unexpectedly shrank by one character 并退出拒绝打包,原因是不能有最后那个”/”,必须写成 --with-openssl=../openssl-1.1.1-tls1.3-draft-18 。

暂时不清楚 draft-18 具体实现了哪些特性(先坑着吧,反正没有一个性能测试工具支持 TLS 1.3)  https://github.com/openssl/openssl/issues/963 记录了一部分人踩坑的总结,另外想编译一个 with openssl 1.1.1 的 curl 一直编不过,想使用 openssl s_client 也感觉编译比较困难,最近实在事多暂时不管了(逃)

一条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注