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

・10 分钟阅读

使用不同的系统?

TLS 1.3是传输层安全TLS协议的一个版本,于2018年作为标准发布在rfc 8446中RFC 8446 ,它提供了安全性和性能改进。

本指南会演示如何在Ubuntu 18.04服务器的Nginx web服务器启用TLS 1.3.

要求

  • Nginx版本1.13.0或更高版本,
  • OpenSSL版本1.1.1或更高版本,
  • 运行Ubuntu 18.04的云主机实例
  • 有效域名和正确配置的A/AAAA/CNAME DNS记录,
  • 有效的TLS证书,我们将从Let's Encrypt获取一个。

开始之前

检查Ubuntu版本。


lsb_release -ds
# Ubuntu 18.04.1 LTS

使用sudo访问创建一个新的non-root用户帐户,并且切换到它。


adduser johndoe --gecos"John Doe"
usermod -aG sudo johndoe
su - johndoe

注:将johndoe替换为你的用户名。

设置时区。


sudo dpkg-reconfigure tzdata

确保你的系统是最新的。


sudo apt update && sudo apt upgrade -y

安装build-essentialsocatgit软件包。


sudo apt install -y build-essential socat git

安装Acme.sh客户端,并且从Let's Encrypt获取TLS证书,

下载并安装Acme.sh


sudo mkdir /etc/letsencrypt
git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh 
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail your_email@example.com
cd ~
source ~/.bashrc

检查版本。


acme.sh --version
# v2.8.0

为你的域获取RSA和ECDSA证书。


# RSA 2048
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --ocsp-must-staple --keylength 2048
# ECDSA
sudo /etc/letsencrypt/acme.sh --issue --standalone --home /etc/letsencrypt -d example.com --ocsp-must-staple --keylength ec-256

注意:使用你的域名替换命令中的example.com

运行前面的命令后,你的证书和密钥会在以下位置访问:

  • 用于RSA :/etc/letsencrypt/example.com目录,
  • 对于ecc/ecdsa :/etc/letsencrypt/example.com_ecc目录,

从源代码生成Nginx

Nginx在版本1.13.0中增加了对TLS 1.3的支持,在大多数Linux发行版上,包括Ubuntu 18.04,nginx都是使用较旧的OpenSSL版本构建的,它不支持TLS 1.3。因此,我们需要自己的自定义Nginx构建链接到OpenSSL 1.1.1版本,它包含了对TLS 1.3的支持。

下载Nginx源代码的最新主线版本,并且提取它。


wget https://nginx.org/download/nginx-1.15.5.tar.gz && tar zxvf nginx-1.15.5.tar.gz

下载OpenSSL 1.1.1源代码并提取它。


# OpenSSL version 1.1.1
wget https://www.openssl.org/source/openssl-1.1.1.tar.gz && tar xzvf openssl-1.1.1.tar.gz

删除所有.tar.gz文件,因为它们不再需要。

 
rm -rf *.tar.gz

 

输入Nginx源目录。

 
cd ~/nginx-1.15.5

 

配置,编译和安装Nginx ,为了简单起见,我们只编译TLS 1.3工作所必需的基本模块,如果需要完整的Nginx构建,你可以阅读关于Nginx编译的向导


./configure --prefix=/etc/nginx 
 --sbin-path=/usr/sbin/nginx 
 --modules-path=/usr/lib/nginx/modules 
 --conf-path=/etc/nginx/nginx.conf 
 --error-log-path=/var/log/nginx/error.log 
 --pid-path=/var/run/nginx.pid 
 --lock-path=/var/run/nginx.lock 
 --user=nginx 
 --group=nginx 
 --build=Ubuntu 
 --builddir=nginx-1.15.5 
 --http-log-path=/var/log/nginx/access.log 
 --http-client-body-temp-path=/var/cache/nginx/client_temp 
 --http-proxy-temp-path=/var/cache/nginx/proxy_temp 
 --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp 
 --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp 
 --http-scgi-temp-path=/var/cache/nginx/scgi_temp 
 --with-compat 
 --with-http_ssl_module 
 --with-http_v2_module 
 --with-openssl=../openssl-1.1.1 
 --with-openssl-opt=no-nextprotoneg 
 --without-http_rewrite_module 
 --without-http_gzip_module

make
sudo make install

创建Nginx系统组和用户。


sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos"nginx user" --group nginx

链接到/etc/nginx/modules目录的链接/usr/lib/nginx/modulesetc/nginx/modules是Nginx模块的标准位置。


sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

创建Nginx缓存目录,并且设置适当的权限。


sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*

检查Nginx版本。


sudo nginx -V

# nginx version: nginx/1.15.5 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-27ubuntu1~18.04)
# built with OpenSSL 1.1.1 11 Sep 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx . . .
# . . .

创建nginx systemd单元文件。


sudo vim /etc/systemd/system/nginx.service

使用以下配置填充文件。


[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

启动并启用Nginx 。


sudo systemctl start nginx.service
sudo systemctl enable nginx.service

/etc/nginx目录中创建conf.dsites-availablesites-enabled目录。


sudo mkdir /etc/nginx/{conf.d,sites-available,sites-enabled}

运行sudo vim/etc/nginx/nginx.conf,并在文件末尾添加以下两个指令,就在关闭}之前。


 . . .
 . . .
 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*.conf;
}

保存文件并退出: +W+Q。

配置Nginx for TLS 1.3

成功构建Nginx之后,我们已经准备好将它配置成在服务器上使用TLS 1.3.

运行 sudo vim /etc/nginx/conf.d/example.com.conf 并使用以下配置填充文件。


server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;

 # RSA
 ssl_certificate /etc/letsencrypt/example.com/fullchain.cer;
 ssl_certificate_key /etc/letsencrypt/example.com/example.com.key;
 # ECDSA
 ssl_certificate /etc/letsencrypt/example.com_ecc/fullchain.cer;
 ssl_certificate_key /etc/letsencrypt/example.com_ecc/example.com.key;

 ssl_protocols TLSv1.2 TLSv1.3;

 ssl_prefer_server_ciphers on;

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

保存文件并退出: +W+Q。

注意ssl_protocols指令的新TLSv1.3参数,此参数对于启用TLS 1.3是必需的。

检查配置。

 
sudo nginx -t

 

重新加载Nginx 。


sudo systemctl reload nginx.service

要验证TLS 1.3,你可以使用浏览器开发工具或SSL Labs服务。

恭喜你,已经成功在Ubuntu 18.04 web服务器上启用了TLS 1.3.!

Hrh profile image