如何在Ubuntu 18.04和16.04的Nginx中启用TLS 1.3

由于IETF(RFC 8446)在2018年8月发布了TLS 1.3,HTTPS变得更快,更安全。TLS1.3现在是TLS协议的最新版本。 本教程将向您展示如何在Ubuntu 18.04和Ubuntu 16.04的Nginx Web服务器中启用TLS 1.3。

更新资料:有一种启用TLS 1.3的简便方法。 请参阅本文:如何在Ubuntu 18.10、18.04、16.04和14.04的Nginx中轻松启用TLS 1.3

TLS 1.3:改进的性能和安全性

在性能方面,TLS 1.2需要两次往返来建立HTTPS连接。 使用TLS 1.3,仅需要一次往返。 TLS 1.3还支持零往返模式(恢复0-RTT会话),允许以前连接到您的网站的客户端将第一条消息上的HTTP请求发送到服务器。 对于移动网络上或远距离位置的用户而言,这具有很大的不同。

在安全性方面,TLS 1.3删除了对旧密码套件的支持,该套件负责诸如ROBOT攻击的漏洞利用。 因此,服务器管理员无法再在TLS 1.3中添加旧的密码套件来安抚旧的Web浏览器的用户。 当然,这是过于简单的解释。 CloudFlare很好地解释了TLS 1.3。

在Ubuntu 18.04,Ubuntu 16.04的Nginx中启用TLS 1.3

要使用Nginx启用TLS 1.3,有两个要求。

  1. 您的Nginx版本必须支持TLS 1.3。 这意味着nginx 1.13或更高版本。
  2. Nginx需要使用OpenSSL 1.1.1+构建或与OpenSSL 1.1.1+一起运行。

第二个要求听起来可能令人困惑,所以让我举两个例子。

  • Ubuntu 18.04随附OpenSSL 1.1.0。 替换系统OpenSSL库不是一个好主意,但是您可以下载OpenSSL 1.1.1源代码,并使用OpenSSL 1.1.1源代码编译Nginx以启用TLS 1.3。
  • Arch Linux当前随附OpenSSL 1.1.1,但是Arch存储库中的Nginx软件包实际上是使用OpenSSL 1.1.0构建的。 在这种情况下,Nginx不是使用OpenSSL 1.1.1构建的,而是使用OpenSSL 1.1.1运行的。

现在让我们看看如何在Ubuntu 18.04和Ubuntu 16.04上使用OpenSSL 1.1.1编译Nginx。

1.添加官方Nginx存储库

而不是下载源tarball并使用 make,我将把官方的Nginx存储库添加到我的Ubuntu服务器,然后从源代码创建一个deb包。 这样,我无需手动将一长串配置参数添加到 configure 命令。 在deb软件包中还将有一个方便的systemd服务文件。

首先获取Nginx GPG密钥,并将其导入到Ubuntu。

wget http://nginx.org/keys/nginx_signing.key

sudo apt-key add nginx_signing.key

然后为Nginx存储库创建源列表文件。

sudo nano /etc/apt/sources.list.d/nginx.list

将以下两行添加到文件中。 的 deb-src 行允许我们使用以下命令下载Nginx源程序包: apt source 命令。 Bonic 是Ubuntu 18.04的代号。 如果您使用的是Ubuntu 16.04,则将其替换为 xenial。 (注意:此存储库不支持32位操作系统。)

deb [arch=amd64] http://nginx.org/packages/mainline/ubuntu/ bionic nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ bionic nginx

要在Nano文本编辑器中保存文件,请按 Ctrl+O,然后按Enter确认。 要退出,请按 Ctrl+X。 然后更新本地包索引。

sudo apt update

现在,Nginx官方存储库已添加到Ubuntu服务器。

2.下载Nginx和OpenSSL源代码

我们将做一个 nginx 目录下 /usr/local/src/ 存储Nginx源,然后 cd 进入那个目录。

sudo mkdir /usr/local/src/nginx
 
cd /usr/local/src/nginx/

使用以下命令下载Nginx源码包:

sudo apt install dpkg-dev

sudo apt source nginx

检查下载的文件。

ls

输出:

nginx-1.15.3                               nginx_1.15.3-1~bionic.dsc
nginx_1.15.3-1~bionic.debian.tar.xz        nginx_1.15.3.orig.tar.gz

然后克隆OpenSSL github存储库。

cd /usr/local/src

sudo apt install git

sudo git clone https://github.com/openssl/openssl.git

cd openssl

接下来,列出所有分支并切换到1.1.1稳定分支。

git branch -a

sudo git checkout OpenSSL_1_1_1-stable

3.编辑Nginx编译规则

编辑Nginx编译规则文件。

sudo nano /usr/local/src/nginx/nginx-1.15.3/debian/rules

config.status.nginx: config.env.nginx 部分。 在CFLAGS行的末尾添加以下文本。 请注意,以下文字本身不是一行。

--with-openssl=/usr/local/src/openssl

保存并关闭文件。

4.编译Nginx

确保您位于Nginx源目录中。

cd /usr/local/src/nginx/nginx-1.15.3/

安装依赖项以构建我们的Nginx deb包。

sudo apt build-dep nginx

现在,使用以下命令来构建deb软件包。

sudo dpkg-buildpackage -b

如果看到以下错误,

missing initializer for field 'md_ctrl' of 'EVP_MD {aka const struct evp_md_st}

然后编辑 auto/cc/gcc 文件。

sudo nano /usr/local/src/nginx/nginx-1.15.3/auto/cc/gcc

注释掉以下行。 的 -Werror 标志使GCC将警告视为错误。

CFLAGS="$CFLAGS -Werror"

然后重新运行构建命令。 构建完成后,将在其中包含一个Nginx deb包。 /usr/local/src/nginx/ 目录。 如果您以前已经安装过Nginx,那么现在是时候删除旧版本,然后再安装新版本了。

sudo apt remove nginx nginx-common nginx-full

cd /usr/local/src/nginx/

sudo dpkg -i nginx_1.15.3-1~bionic_amd64.deb

现在让我们启动Nginx。

sudo systemctl start nginx

如果您看到以下错误消息。

Failed to start nginx.service: Unit nginx.service is masked.

然后取消屏蔽nginx并再次发出启动命令。

sudo systemctl unmask nginx

请注意,Nginx进程可能以用户身份运行 nginx 要么 www-data。 可以通过在其中编辑第一行来更改 /etc/nginx/nginx.conf 文件。 只要确保Nginx与PHP-FPM以同一用户身份运行即可。

现在检查Nginx的配置参数。

sudo nginx -V

nginx tls 1.3 Ubuntu

如您所见,我们拥有使用OpenSSL 1.1.1构建的最新版本的Nginx。

5.在Nginx服务器块中启用TLS 1.3

现在,我假设您已经为Nginx服务器块启用了HTTPS。 启用TLS 1.3的语法非常简单。 在以下位置打开您的Nginx服务器阻止文件 /etc/nginx/conf.d/ 目录或 /etc/nginx/sites-enabled/ 目录。 找到以下行。

ssl_protocols  TLSv1.2;

TLSv1.3 到协议列表。

ssl_protocols TLSv1.2 TLSv1.3;

然后将以下3个密码套件添加到您现有的密码套件中。

TLS-CHACHA20-POLY1305-SHA256
TLS-AES-256-GCM-SHA384
TLS-AES-128-GCM-SHA256

像这样:

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';

nginx tls 1.3 Ubuntu 16.04

保存并关闭文件。 然后测试Nginx配置并重新加载。

sudo nginx -t

sudo systemctl reload nginx

Ubuntu 18.04不太可能切换到OpenSSL 1.1.1,因此如果您使用以下命令升级Nginx, sudo apt upgrade 命令,TLS 1.3将消失。 阻止Nginx升级是一个好主意 apt 使用此命令:

sudo apt-mark hold nginx

更新:从Nginx 1.15.4开始,您可以通过在ssl服务器上下文中添加以下指令,来使用OpenSSL启用0-RTT。 默认值设置为 off。 在以前的版本1.15.3中,它只能与BoringSSL一起使用。

ssl_early_data on

在Google Chrome中启用TLS 1.3

当前,Firefox 62和Chrome 69仅支持TLS 1.3的草案28。 OpenSSL 1.1.1支持TLS 1.3的最终版本。 基于草稿版本和最终RFC版本的实现无法互操作。

要立即测试我们的Nginx服务器,我们需要安装Google Chrome浏览器的Beta版本并启用TLS 1.3的最终版本。 安装了Chrome Beta之后,按Enter chrome://flags/#tls13-variant 在地址栏中,然后从 defaultEnabled (Final)。 然后重新启动Google Chrome浏览器,以使更改生效。

启用tls 1.3 chrome

现在,在Google Chrome Beta中访问启用了TLS 1.3的网站,然后按 Ctrl+Shift+I 打开开发人员工具页面。 去 Security 标签。 您可以看到正在使用的TLS版本。

启用tls 1.3 nginx

据说Firefox将在Firefox 63中发布最终版本的TLS 1.3,该版本计划于2018年10月发布。在Chrome 70中,将为传出连接启用TLS 1.3的最终版本。

更新:Chrome 70添加了对TLS 1.3最终版本的支持,但默认情况下,它仍使用TLS 1.3草案28仍保持不变。

使用CloudFlare启用TLS 1.3

如果您正在使用CloudFlare CDN(内容交付网络),则您的网站已经在使用TLS1.3。 在CloudFlare仪表板中,选择 crypto 标签,您将看到启用/禁用TLS 1.3的选项。 您也可以启用0-RTT。 CloudFlare支持草案28版本和最终版本。

tls 1.3 0-rtt

而已! 我希望本教程可以帮助您在Ubuntu 18.04和Ubuntu 16.04的Nginx中启用TLS 1.3。 照顾自己。

Sidebar