Introdução
O TLS 1.3 é uma versão do protocolo TLS (Transport Layer Security) publicada em 2018 como um padrão proposto na RFC 8446 . Oferece melhorias de segurança e desempenho em relação aos seus antecessores.
Este guia explica como habilitar o TLS 1.3 usando o servidor web Nginx no Debian 9.
Exigências
	- Versão Nginx 1.13.0ou superior.
- Versão OpenSSL 1.1.1ou superior.
- Instância do Vultr Cloud Compute (VC2) executando o Debian 9 x64 (estiramento).
- Um nome de domínio válido e registros DNS / A/ configurados corretamente para seu domínio.AAAACNAME
- Um certificado TLS válido. Obteremos um do Let's Encrypt.
Antes de você começar
Verifique a versão do Debian.
lsb_release -ds
# Debian GNU/Linux 9.9 (stretch)
Verifique se o seu sistema está atualizado.
apt update && apt upgrade -y
Instale os pacotes necessários.
apt install -y git unzip curl sudo socat build-essential
Crie uma nova conta de usuário não raiz com sudoacesso e mude para ela.
adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
su - johndoe
NOTA:  Substitua johndoepelo seu nome de usuário.
Configure o fuso horário.
sudo dpkg-reconfigure tzdata
Instale o cliente Acme.sh e obtenha um certificado TLS em Let's Encrypt
Baixe e instale 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
Verifique a versão.
/etc/letsencrypt/acme.sh --version
# v2.8.2
Obtenha certificados RSA e ECDSA para o seu domínio.
# 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
NOTA:  Substitua example.compelo seu nome de domínio.
Depois de executar os comandos anteriores, seus certificados e chaves estão acessíveis nos seguintes locais:
	- RSA :/etc/letsencrypt/example.com
- ECC / ECDSA :/etc/letsencrypt/example.com_ecc
Compile o Nginx a partir do código-fonte
O Nginx adicionou suporte ao TLS 1.3 na versão 1.13.0. Na maioria das distribuições Linux, incluindo o Debian 9, o Nginx é construído com a versão mais antiga do OpenSSL, que não suporta o TLS 1.3. Consequentemente, precisamos de nossa própria compilação personalizada do Nginx vinculada à versão do OpenSSL 1.1.1, que inclui suporte ao TLS 1.3.
Baixe a versão principal mais recente do código fonte do Nginx e extraia-o.
wget https://nginx.org/download/nginx-1.17.0.tar.gz && tar zxvf nginx-1.17.0.tar.gz
Faça o download do código-fonte do OpenSSL 1.1.1c e extraia-o.
# 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
Exclua todos os .tar.gzarquivos, pois eles não são mais necessários.
rm -rf *.tar.gz
Digite o diretório de origem Nginx.
cd ~/nginx-1.17.0
Configure, compile e instale o Nginx. Por uma questão de simplicidade, compilaremos apenas os módulos essenciais necessários para o TLS 1.3 funcionar. Se você precisar de uma compilação completa do Nginx, poderá ler este guia do Vultr sobre a compilação do 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=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
Crie um grupo de sistema e usuário do Nginx.
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
Link simbólico /usr/lib/nginx/modulespara /etc/nginx/modules. Este último é um local padrão para os módulos Nginx.
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
Crie diretórios de cache do Nginx e defina as permissões apropriadas.
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/*
Verifique a versão do 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 . . .
# . . .
Crie um arquivo de unidade do sistema Nginx.
sudo vim /etc/systemd/system/nginx.service
Preencha o arquivo com a seguinte configuração.
[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
Inicie e ative o Nginx.
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
Criar conf.d, sites-availablee sites-enableddiretórios /etc/nginx.
sudo mkdir /etc/nginx/{conf.d,sites-available,sites-enabled}
Execute sudo vim /etc/nginx/nginx.confe adicione as duas diretivas a seguir no final do arquivo, imediatamente antes do fechamento }.
    . . .
    . . .
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
}
Salve o arquivo e saia com :+ W+ Q.
Agora que construímos o Nginx com sucesso, estamos prontos para configurá-lo para começar a usar o TLS 1.3 em nosso servidor.
Execute sudo vim /etc/nginx/conf.d/example.com.confe preencha o arquivo com a seguinte configuração.
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;
}
Salve o arquivo e saia com :+ W+ Q.
Observe o novo TLSv1.3parâmetro da ssl_protocolsdiretiva. Este parâmetro é necessário para ativar o TLS 1.3.
Verifique a configuração.
sudo nginx -t
Recarregue o Nginx.
sudo systemctl reload nginx.service
Para verificar o TLS 1.3, você pode usar as ferramentas de desenvolvimento do navegador ou o serviço SSL Labs. As capturas de tela abaixo mostram a guia de segurança do Chrome que indica que o TLS 1.3 está funcionando.


Parabéns! Você ativou o TLS 1.3 com sucesso em seu servidor Debian 9.