如何在Debian 9的Nginx中启用TLS 1.3

介绍

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

创建一个具有sudo访问权限的新非root用户帐户并切换到该帐户。

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 your_email@example.com
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.dsites-availablesites-enabled在目录中/etc/nginx

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

运行sudo vim /etc/nginx/nginx.conf以下代码,并将以下两个指令添加到文件的末尾,就在close之前}

    . . .
    . . .
    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的Nginx中启用TLS 1.3

如何在Debian 9的Nginx中启用TLS 1.3

恭喜你!您已在Debian 9服务器上成功启用TLS 1.3。

留下評論

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息