在前一篇文章里曾介绍过在openssl1.1.0没发布之前如何让nginx支持ChaCha20-Poly1305加密套件。最近也有时间尝试一下给自己的博客增加TLS 1.3的支持。需要注意目前 Chrome 和 Firefox 支持的是 TLS 1.3 draft 18。CloudFlare 的这篇文章:An overview of TLS 1.3 and Q&A介绍了一些有关TLS 1.3的知识。需要的小伙伴可以自己去阅读。
依赖环境
依赖环境当然是手动编译nginx的时候所有的依赖啦。我的系统是Ubuntu16.04。所以这里我以Ubuntu为例进行解释。依赖包括pcre,zlib等。如果不知道编译nginx需要什么依赖,可以自行搜索。openssl这里不要用apt安装,因为包管理默认的openssl并不支持TLS1.3,所以我们需要一个支持TLS1.3的的openssl来作为nginx编译时候的依赖。Github 上openssl 有draft-18 以及draft-19 分支,当然Master分支跟进了TLS1.3-Draft22,23,但是我发现并不是所有的浏览器都能支持到TLS1.3-Draft22以上,而我们只是做为研究,所以这里使用OpenSSL 1.1.1 的 draft-18 分支。
分支下载地址
或者使用git直接拉取github上的分支代码。
git clone -b tls1.3-draft-18 --single-branch https://github.com/openssl/openssl.git openssl-tls1.3
编译方法
在获取了支持TLS1.3的openssl源码后,我们需要在编译nginx的时候,添加一些编译参数。在./configure后加上以下参数即可。
--with-openssl=/path/to/openssltls1.3 --with-openssl-opt='enable-tls1_3'
参数中的enable-tls1_3是非常关键的,目的是让openssl启用TLS1.3。
make和install过程在此不做讨论。
Nginx配置文件
编译安装完成后,我们还需要在nginx的配置文件中做一些修改。将下面的配置覆盖到原有的配置文件的相应位置即可。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 增加 TLSv1.3 ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
配置中的 TLS13 是 TLS 1.3 新增的 Cipher Suite,加在最前面即可。
在浏览器中启用TLS 1.3
目前最新版 Chrome 和 Firefox 都支持 TLS 1.3,但需要手动开启:
Chrome,将 chrome://flags/ 中的 TLS 1.3 改为 Enabled (Draft));
Firefox,将 about:config 中的 security.tls.version.max 改为 4。
emmmm,打完收工。