Canary Workshop

Whatever is worth doing at all is worth doing well

初探nginx+TLS 1.3

春天到了,又到了交配折腾的季节。

一直以来我都在关注TLS 1.3的进展。TLS 1.3作为新一代的安全标准,对比前代的提升是巨大的(参考Cloudflare对于TLS 1.3的介绍)。可惜长期以来这个协议都在草案阶段(从IETF文档上来看从2014年至今,且目前仍未最终定稿,只是已经打到最后阶段并且有了相应的实现),并不能真正部署。今天早晨获悉OpenSSL 1.1.1的测试版发布了,带有TLS 1.3的支持。其实火星了一个月

嘛,无论如何,既然已可以部署,那就部署来看看于是拿出了吃灰的NyaBoom的闲置VPS。下面是完整的部署过程。整个部署基于全新安装的Ubuntu 16.04.2,而且仅仅部署HTTPS相关的最基本模块。

截至目前,OpenSSL 1.1.1仍处于测试阶段,而且TLS 1.3协议本身也尚未定稿,因此下面的操作具有不可预料风险,极不建议在生产环境的服务器上部署。

那么,一切就位,开始吧!

0 环境准备

我这里使用了全新的Ubuntu 16.04.2,先准备编译环境:

1
2
3
sudo apt update
sudo apt upgrade
sudo apt install build-essential git

1 获取文件

1
2
3
4
mkdir nginx
git clone -b tls1.3-draft-18 https://github.com/openssl/openssl.git openssl #获取支持TLS 1.3的测试版分支
wget http://nginx.org/download/nginx-1.11.12.tar.gz #nginx版本可替换
tar -xzvf nginx-1.11.12.tar.gz

2 开始编译

尽管是TLS 1.3分支,这个版本的OpenSSL也默认不开启TLS 1.3支持,因此使用enable-tls1_3参数来加入支持

1
2
3
4
cd nginx-1.11.2
./configure --with-openssl=../openssl --with-openssl-opt=enable-tls1_3 --with-http_v2_module --with-http_ssl_module #我这里仅仅打开了HTTPS支持和HTTP2支持
make
sudo make install

3 配置阶段

先把nginx指令加入PATH

1
2
3
sudo su
cd /usr/local/nginx/sbin
ln -s nginx /usr/bin/nginx

这里出于测试目的,我直接修改了nginx.conf中自带的虚拟主机:

1
2
cd ../conf
vim nginx.conf

以下是我的虚拟主机配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 443 ssl http2;
server_name nya.dyn.im;
ssl_certificate 证书位置;
ssl_certificate_key 私钥位置;
ssl_protocols TLSv1.2;
ssl_ciphers TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}

可以注意到,虚拟主机配置中有两点不同以往的:一者,ssl_protocols中设置为TLSv1.2,这是因为nginx尚未加入对 TLS 1.3的支持。二者,ssl_ciphers中的Cipher都带有TLS13前缀。这两处不同是保证开启TLS 1.3的关键。

随后可以用nginx -t确保配置正确和使用init.d脚本管理nginx服务,在此不多言。

4 测试阶段

直到今天(2017年4月3日),只有Chrome的最新版和Firefox的测试版加入了TLS 1.3支持,而且需要在浏览器设置中自行开启。我这里使用的正式版Chrome开启TLS 1.3后访问刚刚配置好的站点得到的连接情况如图:
alt

若是不支持TLS 1.3的浏览器会直接报错。当然了,亦可设置上面的虚拟主机文件为兼容TLS 1.3,不支持的会自动回落TLS 1.2甚至更老的协议,只需加入常规的Ciphers即可实现,不再赘述。

另外,可以使用支持TLS 1.3的浏览器访问https://nya.dyn.im以查看demo,目前该站点就被配置为只接受 TLS 1.3连接。顺带吐槽一句,SSL Labs的公开版和开发版都无法识别TLS 1.3协议,会直接报错
2017年6月17日更新:该服务器已关闭

-EOF-