Nginx 实现 TLS1.3 前瞻菜谱~
前言
随着苹果强制HTTPS机制、Chrome提示非HTTPS网站 “Not Security”的硬,以及 HTTP/2 更好的性能,HTTPS 更好的安全性的软,厂商和社区一番软硬皆施后,2016无疑是 HTTPS 和 HTTP/2 的普及年。而在 2017年 TLS1.3 协议也将要出炉了~
TLS1.3 不仅大幅提高安全性,还大幅度简化了握手过程,使第一次握手时只需要一个RTT,并在第二次访问时提供了 0-RTT 模式,提高了性能降低服务器压力。因此,TLS1.3 是一个不升白不升,升好处还很多的干货协议呀!
关于 TLS1.3 具体内容的废话我就不说了,大佬们写的肯定比我更好。
不过,TLS1.3 草稿来,草稿去已经很久,截止米饭发文已经到了第20稿了,所以本文介绍的内容依旧不能够用于生产环境哟!
下面我打算以做菜的形式风趣的介绍一下~
准备的食材
Ubuntu 16.04,这里用 Ubuntu 为例 Nginx 1.13,最新的 MainLine 版本已经支持 TLS1.3 协议了!OpenSSL 1.1.1,完全兼容 OpenSSL 1.1.0 系列的API,只是添加了 TLS1.3 的支持 域名,嗯,你的域名 证书,域名对应的SSL证书和密钥
制作教程
安装编译软件(现场造个厨房)
apt install dpkg-dev build-essential zlib1g-dev libpcre3 libpcre3-dev unzip
下载源文件(准备食材)
OpenSSL 1.1.1 draft-18
虽然 TLS1.3 的菜谱已经被各大厨共同探讨到第20稿子了,但是盛菜的浏览器普遍都只支持第18稿,所以我们也以 Draft18 为服务端的协议。
cd /opt/
git clone -b tls1.3-draft-18 --single-branch https://github.com/openssl/openssl.git openssl-tls1.3
Nginx 1.13
Nginx 1.13 开始正式支持 TLS1.3 协议,虽然 1.11 最后几个版本也隐约有支持,但是肯定不稳定,容易糊锅。
cd /opt/
wget http://nginx.org/download/nginx-1.13.1.tar.gz
编译(开做)
cd /opt/nginx-1.13.1/
./configure --prefix=/usr/local/nginx --with-openssl=/opt/openssl --with-openssl-opt=enable-tls1_3 --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module
make && make install
--with-openssl=
后面跟 OpenSSL 的目录,但是默认是不编译 TLS1.3 的内容的,所以后面要加上 -with-openssl-opt=enable-tls1_3
开启对 TLS1.3 协议的编译。
设置(摆盘)
修改 /usr/local/nginx/conf/nginx.conf
文件,添加虚拟主机文件,这里以我的测试文件为例:
server {
listen 443 ssl http2;
ssl_certificate /usr/local/nginx/conf/www.mf8.biz.crt;
ssl_certificate_key /usr/local/nginx/conf/www.mf8.biz.key;
ssl_protocols TLSv1.2 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;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name www.mf8.biz mf8.biz;
access_log off;
index index.html index.htm index.php;
location / {
root html;
index index.html index.htm;
}
}
具体步骤,
一、在 ssl_protocols
中添加 TLSv1.3
二、修改 ssl_ciphers
,添加 TLS1.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;
三、其他的大家参考自己原来的就行。
启动(上桌)
还是要说一下,TLS1.3 的菜谱已经依旧在商讨当中,没有最终定稿,所以不要用在生产环境中,所以我这里也不做 Nginx 的具体生产步骤了,直接开始尝鲜 TLS1.3。
先检查一下 nginx.conf 文件是否正确,如果有错就找到对应行并修改。
/usr/local/nginx/sbin/nginx -t
启动 Nginx
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
菜品图
Win10 + FireFox 54 中的效果
macOS10.12 + Chrome 58 种的效果
如果上述步骤有一步发生纰漏,就会专业,协议对不上