注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com
介绍
TLS 1.3是传输层安全性(TLS)协议的版本,该协议于2018年作为建议的标准发布于 RFC 8446。与以前的产品相比,它提供了安全性和性能方面的改进。
本指南说明了如何使用Debian 9上的Nginx Web服务器启用TLS 1.3。
要求
Nginx版本 1.13.0
或更高。
OpenSSL版本 1.1.1
或更高。
运行Debian 9 x64(拉伸)的Vultr Cloud Compute(VC2)实例。
有效的域名并正确配置 A
/AAAA
/CNAME
您的域的DNS记录。
有效的TLS证书。我们将从“加密”中获取一个。
在你开始之前
检查Debian版本。
lsb_release -ds
# Debian GNU/Linux 9.9 (stretch)
确保您的系统是最新的。
apt update && apt upgrade -y
安装必要的软件包。
apt install -y git unzip curl sudo socat build-essential
使用以下命令创建一个新的非root用户帐户 sudo
访问并切换到它。
adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
su - johndoe
注意: 更换 johndoe
使用您的用户名。
设置时区。
sudo dpkg-reconfigure tzdata
安装Acme.sh客户端并从Let’s Encrypt获得TLS证书
下载并安装 Acme.sh。
sudo mkdir /etc/letsencrypt
sudo git clone https://github.com/Neilpang/acme.sh.git
cd acme.sh
sudo ./acme.sh --install --home /etc/letsencrypt --accountemail [email protected]
cd ~
source ~/.bashrc
检查版本。
/etc/letsencrypt/acme.sh --version
# v2.8.2
为您的域获取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的支持。在包括Debian 9在内的大多数Linux发行版中,Nginx是使用较旧的OpenSSL版本构建的,该版本不支持TLS 1.3。因此,我们需要链接到OpenSSL 1.1.1版本的自定义Nginx构建,其中包括对TLS 1.3的支持。
下载Nginx源代码的最新主线版本并解压缩。
wget https://nginx.org/download/nginx-1.17.0.tar.gz && tar zxvf nginx-1.17.0.tar.gz
下载OpenSSL 1.1.1c源代码并解压缩。
# OpenSSL version 1.1.1c
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz
删除所有 .tar.gz
文件,因为不再需要它们。
rm -rf *.tar.gz
输入Nginx源目录。
cd ~/nginx-1.17.0
配置,编译和安装Nginx。为简单起见,我们将仅编译TLS 1.3正常运行所需的基本模块。如果您需要完整的Nginx构建,则可以阅读有关Nginx编译的Vultr指南。
./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=Debian
--builddir=nginx-1.17.0
--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.1c
--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
符号链接 /usr/lib/nginx/modules
至 /etc/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.17.0 (Debian)
# built by gcc 6.3.0 20170516 (Debian 6.3.0-18+deb9u1)
# built with OpenSSL 1.1.1c 28 May 2019
# 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
创建 conf.d
, sites-available
和 sites-enabled
目录在 /etc/nginx
。
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退出。
为TLS 1.3配置Nginx
既然我们已经成功构建了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_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';
ssl_prefer_server_ciphers on;
}
保存文件并使用:+ W + Q退出。
注意新 TLSv1.3
的参数 ssl_protocols
指示。该参数对于启用TLS 1.3是必需的。
检查配置。
sudo nginx -t
重新加载Nginx。
sudo systemctl reload nginx.service
要验证TLS 1.3,可以使用浏览器开发工具或SSL Labs服务。以下屏幕截图显示了Chrome的安全性标签,该标签表明TLS 1.3正常运行。
恭喜你!您已在Debian 9服务器上成功启用TLS 1.3。
注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com