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 中的效果

Win10 + FireFox 54 中的效果

macOS10.12 + Chrome 58 种的效果

macOS10.12 + Chrome 58 种的效果

如果上述步骤有一步发生纰漏,就会专业,协议对不上

TLS1.3协议对不上

2 条评论

发表评论

*