Nginx with TLSv1.3

开发历时近2年,在上个星期,OpenSSL终于发布了v1.1.1的第一个预览版,这也是支持 TLSv1.3 的 OpenSSL 的第一个 Release 。
虽然 TLS1.3 的标准还未修改完成,但绝大部分的浏览器(Chrome)都已经内置了实验性TLS1.3的选项。
下面记录一下 Nginx built with OpenSSL 1.1.1 的过程吧

使用系统: Debian Stretch

编译准备

依赖安装,本人习惯性使用 clang 而非 gcc ,所以把 clang 装上了,不喜请忽略

sudo apt install build-essential clang-3.9 -y

Nginx 在 1.13 才加入了 TLS1.3 的支持,编译时要注意获取 1.13 以上的版本

OpenSSL 1.1.1 pre1 兼容的 TLS1.3 版本为 draft-23

    • 更新: openssl-1.1.1-pre2 发布
    • 2018-09-11更新: 目前 OpenSSL1.1.1 正式版已经发布了,Chrome 预计在 Chrome 70 ( 1个月后发布 stable 版 ) 正式支持正式版的 Tls1.3 ,目前 Chrome 69 Flags 中可选择版本为 Draft 23 ( 对应 OpenSSL 1.1.1 pre2 ) 以及 Draft 28 版 ( 对应 OpenSSL 1.1.1 pre8 )   ,目前已经可以做好切换正式版的准备了
wget http://nginx.org/download/nginx-1.13.9.tar.gz
wget https://www.openssl.org/source/openssl-1.1.1-pre2.tar.gz
tar zxvf nginx-1.13.9.tar.gz
tar zxvf openssl-1.1.1-pre2.tar.gz

编译

OpenSSL 1.1.1 默认开启 tls1.3 ,所以只需要在编译时追加 --with-openssl 即可

cd nginx-1.13.9
COMPILER=clang-3.9 CXX=clang++-3.9 CC=clang-3.9 ./configure \
  --with-openssl=../openssl-1.1.1-pre2 \
  # 其他编译开关
make
sudo make install

安装完成后的 Nginx 为 built with OpenSSL 1.1.1 就是支持 TLS1.3 的了

设定 TLS 1.3

TLS1.3中新增了5种加密套件,分别为

  • TLS13-AES-256-GCM-SHA384
  • TLS13-CHACHA20-POLY1305-SHA256
  • TLS13-AES-128-GCM-SHA256
  • TLS13-AES-128-CCM-8-SHA256
  • TLS13-AES-128-CCM-SHA256

Nginx 设定很简单,只需要

  1. ssl_protocols中新增TLSv1.3
  2. ssl_ciphers最前面加入以上5种加密套件

使用 Mozilla 提供的 SSL Configuration Generator 生成并修改即可。

最终看上去的配置是这样的

server {
    #...
    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    #...
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS;
   #...
}

启动 Nginx 无错误,然后在浏览器端还需要做一些工作。

要启用 TLS1.3 draft-23 至少需要 Chrome 65 以上( Chrome 64 以下支持的是 TLS1.3 draft-18)

在 chrome://flags/#tls13-variant 中选择 Enabled (Draft 23)并重启浏览器

访问网站时即可看到 TLS1.3 生效

 

喵~

1 comment

Leave a comment

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

退出移动版