Se você está precisando proteger sua aplicação/site “rodando” no Nginx de graça, eis a solução!
Neste artigo vou te explicar.
Então… pega aí a dica e proteja o Nginx com Let’s Encrypt no Ubuntu 20.04!
O que é Let’s Encrypt
Let’s Encrypt é uma autoridade de certificação gratuita, automatizada e aberta desenvolvida pelo Internet Security Research Group (ISRG) que fornece certificados SSL gratuitos.
Para ativar o HTTPS em seu site, você precisa obter um certificado (um tipo de arquivo) provido por uma Autoridade Certificadora (AC).
Para obter um certificado da Let’s Encrypt para o domínio do seu website você precisa, é claro, demonstrar controle sobre o domínio.
Com a Let’s Encrypt, você pode fazer isso usando um software que usa o protocolo ACME, que normalmente é executado no seu servidor web.
Os certificados emitidos pela Let’s Encrypt são confiáveis por todos os principais navegadores e válidos por 90 dias a partir da data de emissão. Fique tranquilo que explico como renovar automaticamente também.
Este tutorial explica como instalar um certificado SSL Let’s Encrypt gratuito no Ubuntu 20.04, executando o Nginx como um servidor web. Também mostraremos como configurar o Nginx para usar o certificado SSL e habilitar o HTTP/2.
Pré-requisitos
Antes de continuar, verifique se você atendeu aos seguintes pré-requisitos:
- Você tem um nome de domínio apontando para seu IP público. Nós usaremos
example.com
. - Você tem o Nginx instalado no seu servidor.
- Seu firewall está configurado para aceitar conexões nas portas 80 e 443.
Instalando o Certbot
Usaremos o certbot para obter e renovar os certificados.
Certbot é uma ferramenta completa e fácil de usar que automatiza as tarefas para obter e renovar certificados SSL Let’s Encrypt e configurar servidores web para usar os certificados.
O Certbot é feito pela Electronic Frontier Foundation (EFF) , uma organização sem fins lucrativos 501(c)3 com sede em San Francisco, CA, que defende a privacidade digital, liberdade de expressão e inovação (Agradecimento especial: obrigado por tudo que já fizeram por nós).
Bom, retomando… o pacote certbot está incluído nos repositórios padrão do Ubuntu.
Para instalá-lo execute os seguintes comandos:
sudo apt update
sudo apt install certbot
Gerando Grupo Dh Forte (Diffie-Hellman)
A troca de chaves Diffie–Hellman (DH) é um método de troca segura de chaves criptográficas em um canal de comunicação não seguro.
Gere um novo conjunto de parâmetros DH de 2048 bits digitando o seguinte comando:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Você também pode usar um comprimento de chave de até 4096 bits, mas a geração pode levar mais de 30 minutos, dependendo da entropia do sistema.
Obtendo um certificado SSL Let’s Encrypt
Para obter um certificado SSL para o domínio, vamos usar o plugin Webroot que funciona criando um arquivo temporário para validar o domínio solicitado no diretório ${webroot-path}/.well-known/acme-challenge
. O servidor Let’s Encrypt faz solicitações HTTP para o arquivo temporário para verificar se o domínio solicitado resolve para o servidor onde o certbot é executado.
Para simplificar, vamos mapear todas as solicitações HTTP para .well-known/acme-challenge
um único diretório, /var/lib/letsencrypt
.
Os comandos a seguir criarão o diretório e o tornarão gravável para o servidor Nginx:
sudo mkdir -p /var/lib/letsencrypt/.well-known
sudo chgrp www-data /var/lib/letsencrypt
sudo chmod g+s /var/lib/letsencrypt
Para evitar a duplicação de código, criaremos dois snippets e os incluiremos em todos os arquivos de bloco do servidor Nginx.
Abra seu editor de texto e crie o primeiro snippet, letsencrypt.conf
:
Insira esta configuração em: /etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
allow all;
root /var/lib/letsencrypt/;
default_type "text/plain";
try_files $uri =404;
}
Em seguida, crie o segundo snippet, ssl.conf
, que inclui os picadores recomendados pela Mozilla , habilita OCSP Stapling, HTTP Strict Transport Security (HSTS) e impõe alguns cabeçalhos HTTP focados em segurança.
sudo nano /etc/nginx/snippets/ssl.conf
Insira esta configuração em: /etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE- ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
Depois que os snippets forem criados, abra o arquivo de bloco do servidor de domínio e inclua o letsencrypt.conf
snippet conforme mostrado abaixo:
sudo nano /etc/nginx/sites-available/example.com.conf
Insira esta configuração em: /etc/nginx/sites-available/example.com.conf
server {
listen 80;
server_name example.com www.example.com;
include snippets/letsencrypt.conf;
}
Para habilitar o novo bloco de servidor, crie um link simbólico do arquivo para o diretório sites-enabled
:
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Reinicie o serviço Nginx para que as alterações entrem em vigor:
sudo systemctl restart nginx
Agora você pode executar o Certbot com o plug-in webroot e obter os arquivos de certificado SSL emitindo:
sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com
Se o certificado SSL for obtido com sucesso, o certbot imprimirá a seguinte mensagem:
output
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-10-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot
again. To non-interactively renew *all* of your certificates, run
"certbot renew"
- Your account credentials have been saved in your Certbot
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Certbot so
making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
Agora que você tem os arquivos de certificado, você pode editar seu bloco de servidor de domínio da seguinte forma:
sudo nano /etc/nginx/sites-available/example.com.conf
Substitua a configuração em: /etc/nginx/sites-available/example.com.conf
server {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
server {
listen 80;
server_name www.example.com example.com;
include snippets/letsencrypt.conf;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
include snippets/ssl.conf;
include snippets/letsencrypt.conf;
# . . . other code
}
Não esqueça de substituir todas as referências de "exemple.com" pelo seu domínio definitivo (ex: "seudomínio.com")
Com a configuração acima, estamos forçando o HTTPS e redirecionando da versão www para não www.
Recarregue o serviço Nginx para que as alterações entrem em vigor:
sudo systemctl reload nginx
Para verificar se o certificado SSL foi instalado com sucesso, abra seu site usando https://
e você verá um ícone de cadeado verde.
Se você testar seu domínio usando o SSL Labs Server Test , receberá uma A+
nota, conforme mostrado na imagem abaixo:

Renovação automática do certificado SSL Let’s Encrypt
Os certificados da Let’s Encrypt são válidos por 90 dias. Para renovar automaticamente os certificados antes que eles expirem, o pacote certbot cria um cronjob e um cronômetro do systemd. O cronômetro renovará automaticamente os certificados 30 dias antes de sua expiração.
Quando o certificado é renovado, o serviço nginx precisa ser recarregado.
Abra o /etc/letsencrypt/cli.ini
e adicione a seguinte linha:
sudo nano /etc/letsencrypt/cli.ini
ADICIONE esta configuração em: /etc/letsencrypt/cli.ini
deploy-hook = systemctl reload nginx
Para testar o processo de renovação, execute o comando certbot --dry-run
:
sudo certbot renew --dry-run
Se não houver erros, significa que o processo de renovação foi bem-sucedido.
Conclusão
Mostramos a você como usar o certbot para baixar certificados SSL Let’s Encrypt para seu domínio. Também criamos snippets do Nginx para evitar a duplicação de código e configuramos o Nginx para usar os certificados.
Para saber mais sobre como usar o Certbot, visite sua documentação .
Agradecimento a: linuxize.com pela inspiração e ensinamentos.
Se você tiver alguma dúvida ou feedback, sinta-se à vontade para deixar um comentário.