为你的网站开启 TLS 1.3

得益于 Nginx、OpenSSL 新版本的发布,以及 Chrome、Firefox 等一众浏览器的推进,TLS 1.3 已经能很方便地进行部署了。

实验环境

需要注意的是,TLSv1.3 的启用有两个重要条件:

  • 你的 nginx 必须支持 TLSv1.3,也就是 1.13 以上
  • 你的系统运行 OpenSSL 环境必须大于 1.1.1

由于 Ubuntu 18.04.1 系统的 OpenSSL 版本还停留在 1.1.0,因此我们需要对 nginx 重新编译,截至发稿,本文所用组件版本如下:

Ubuntu 18.04.1 LTS
nginx 1.15.5
OpenSSL 1.1.1 LTS

0. 添加 nginx 官方源

其它文章不同,这里不直接下载 nginx 源码,省去了编译参数的编写

首先信任 nginx pgp

curl https://nginx.org/keys/nginx_signing.key | apt-key add

添加更新源

cat >> /etc/apt/sources.list.d/nginx.list << EOF
deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx
EOF

更新列表

apt update

1. 拉取源码

新建一个目录用于保存源码

mkdir /usr/local/src/nginx && cd /usr/local/src/nginx

拉取 nginx 源码

apt install dpkg-dev -y
apt source nginx

拉取后目录下应该有三个文件,一个文件夹

nginx-1.15.5/
nginx_1.15.5-1~bionic.dsc
nginx_1.15.5-1~bionic.debian.tar.xz
nginx_1.15.5.orig.tar.gz

退到上层目录,拉取 OpenSSL 源码

cd ..
git clone https://github.com/openssl/openssl.git -b OpenSSL_1_1_1-stable

2. 修改编译开关

进入 nginx 目录

cd nginx/nginx-1.15.5/

指定 OpenSSL 运行库

vim debian/rules

如图添加 --with-openssl=/usr/local/src/openssl,保存即可
nginx-openssl

打开 gcc 编译参数文件

vim auto/cc/gcc

注释 CFLAGS="$CFLAGS -Werror"
nginx-gcc

3. 编译 deb

执行编译

apt build-dep nginx
dpkg-buildpackage -b

如果没有错误的话,可以在上层目录下看到如下文件

root@dc:/usr/local/src/nginx# ls
nginx-1.15.5
nginx_1.15.5-1~bionic_amd64.buildinfo
nginx-dbg_1.15.5-1~bionic_amd64.deb
nginx_1.15.5-1~bionic_amd64.changes
nginx_1.15.5-1~bionic.debian.tar.xz
nginx_1.15.5-1~bionic_amd64.deb
nginx_1.15.5-1~bionic.dsc
nginx_1.15.5.orig.tar.gz

如果系统之前安装过其它 nginx 的话建议删除

apt remove nginx nginx-common nginx-full -y --allow-change-held-packages

执行安装

dpkg -i nginx_1.15.5-1~bionic_amd64.deb

启动

systemctl start nginx

锁定版本,防止被 apt 升级覆盖安装

apt-mark hold nginx

4. 检查安装情况

运行命令

nginx -V

如果像下图一样,则证明编译安装成功

nginx-detail

5. 开启 TLSv1.3

编辑 /etc/nginx/nginx.conf,在 http 配置块中添加/修改

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256;
ssl_prefer_server_ciphers on;
ssl_early_data on;

重启

nginx -t
systemctl reload nginx

至此,TLSv1.3 开启成功。

测试支持

目前 OpenSSL 1.1.1 所支持的为 the final version of TLS 1.3,所有草案版本不会被兼容,因此需要升级最新的浏览器,并且打开开关。

  • Chrome: 打开 chrome://flags/#tls13-variant 选择 enabled (Final)
  • Firefox: 打开 about:configsecurity.tls.version.max 改为 4

tls1.3


本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可
本文链接:https://i-meto.com/tls-1-3/

metowolf

Read more posts by this author.