Instalando Let's Encrypt no Ubuntu e Debian com Nginx
Let's Encrypt e Nginx no Ubuntu 18.04, 20.04 e Debian 9, 10
Fala pessoal tudo beleza?
Nesse artigo vamos ver como é fácil criar certificados SSL para o seu site usando o Let's Encrypt e como servidor web usaremos o Nginx.
Let's Encrypt é uma Autoridade de Certificação (CA), que fornece certificados gratuitamente e gerencia seus certificados de uma forma automatizada, facilita todo o processo de criação, validação, instalação e renovação de certificados.
Para instalar e utilizar o Let's Encrypt é necessário que tenha acesso ao shell do seu servidor com um usuário root ou que tenha privilégios de sudo, para que possamos executar os comandos de instalação dos pacotes e para a geração dos certificados.
Disclaimer
Para esse tutorial, utilizei a distribuição Ubuntu 18.04, mas se você estiver usando o Ubuntu 20.04, Debian 9 ou Debian 10, continue, pois irá funcionar sem problemas.
Para serviço de VPS, estou usando um droplet na Digital Ocean.
A Digital Ocean oferece um serviço de hospedagem de VPS excelente, estável e com vários recursos disponíveis em seu painel. Caso queira conhecer mais, utilize meu link de referência para se cadastrar e ganhe créditos assim que começar a utilizar seus serviços. Você ganha e eu também ;)
Instalando o Let's Encrypt
O Let's Encrypt recomenda o uso do cliente Certbot ACME para a maioria das pessoas, pois possuem modos avançados de configurações, e para nós que gostamos de fazer as coisas sem esforço, é uma boa!
Primeiro vamos instalar o pacote Certbot com o plugin do Nginx, digite o comando abaixo:
sudo apt install python-certbot-nginx
Esse comando irá instalar o pacote do Certbot e o plugin para Nginx, caso você ainda não tenha o Nginx instalado, será instalado junto.
Após a instalação do certbot e do plugin, vamos gerar o nosso certificado.
Para que seja possível gerar o certificado SSL seu site deve estar acessível na web, com o DNS já configurado. Caso queira configurar um servidor Nginx veja esse arquivo Aprenda a instalação e a configuração básica de como criar um server block com o servidor web Nginx
Se você usa um firewall em seu servidor, certifique-se que a porta 443
esteja liberada. Para quem usa o utilitário UFW, pode verificar com os comandos:
# Para verificar se a porta está liberada
sudo ufw status
# Para liberar a porta caso não esteja
sudo ufw allow 443
Gerando certificado SSL
Para o nosso exemplo, criei o subdomínio meublog.aristides.dev
.
Para gerar o certificado, utiliza-se o utilitário certbot
com o plugin do nginx
, em seguida o parâmetro -d
seguido do seu domínio.
sudo certbot --nginx -d meublog.aristides.dev
Caso queira criar certificados para mais de um domínio ao mesmo tempo, basta informar os mesmos com o parâmetro -d
.
sudo certbot --nginx -d meusite.com.br -d meusite2.com.br
Ao executar o comando acima, algumas perguntas serão feitas e devem ser respondidas, a primeira é sobre os Termos de Serviço. Informe A
para concordar e continuar.
A segunda é se gostaria de compartihar seu e-mail e receber notícias, campanhas entre outras informações sobre Let's Encrypt.
A terceira pergunta é se deseja que todo o tráfego para seu site seja redirecionado para HTTPS, digite 2
para Sim.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/default
Pronto. Certificado gerado com sucesso. Congratulations!
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://meublog.aristides.dev
You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=meublog.aristides.dev
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/meublog.aristides.dev/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/meublog.aristides.dev/privkey.pem
Your cert will expire on 2020-12-20. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. 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
Muito bom! Seu certificado foi gerado com sucesso e nesse momento seu site já deve estar funcionando com HTTPS.
Validando a configuração do SSL
Veja que após a conclusão do processo, ele informe que é possível testar a "força" que sua configuração possui. Para isso é necessário acessar o site https://www.ssllabs.com/ssltest e digitar o endereço do seu site.
Nota: Se você testar seu site agora, é muito provável que receba a letraB
, que se refere à algumas variavéis de segurança que é testado. Na instalação que usamos aqui, não geramos uma chave RSA e nem a chave DHPARAM, a geração dessas chaves são um passo a mais para aumentar a segurança.
Utilizamos aqui o plugin do Nginx para a instalação, por isso que automaticamente nosso arquivo de configuração foi atualizado com as informações dos certificados e redirecionamento para HTTPS.
Para ter um certificado mais seguro, geralmente utilizamos ocertbot certonly
, para apenas gerar os certificados e manualmente as configurações e a geração de chaves RSA e DHPARAM deve ser feitas pelo administrador.
Estarei escrevendo um outro post a respeito dessa configuração!
Renovação automática
O certificado gerado tem validade por 90 dias. Para que o certificado seja renovado e você não tenha problemas com seu site, o Let's Encrypt cria uma entrada no cron do Linux para que automaticamente seja renovado o certificado quando necessário.
Veja o arquivo criado em /etc/cron.d/certbot
, o mesmo é executado a cada 12 horas.
# /etc/cron.d/certbot: crontab entries for the certbot package
#
# Upstream recommends attempting renewal twice a day
#
# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc. Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew
Caso queira simular manualmente a renovação dos certificados, execute o comando certbot renew
com o parâmetro --dry-run
.
# Para simular
sudo certbot renew --dry-run
# Para renovar
sudo certbot renew
Se você executar o comando para renovar e se ainda não for necessário, será retornada uma mensagem que não existe certificado para renovação.
Listar informações sobre certificados
Para saber maiores informações sobre todos os certificados que foram gerados pelo certbot, execute o comando certbot certificates
:
sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
Certificate Name: meublog.aristides.dev
Domains: meublog.aristides.dev
Expiry Date: 2020-12-20 00:12:05+00:00 (VALID: 89 days)
Certificate Path: /etc/letsencrypt/live/meublog.aristides.dev/fullchain.pem
Private Key Path: /etc/letsencrypt/live/meublog.aristides.dev/privkey.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Remover um certificado
Caso você não precise mais de um certificado criado para um domínio, seja por qual motivo for, a maneira mais simples e eficiente de fazer isso é utilizar os comandos que o certbot nos fornece.
# Remover através de uma lista fornecida pelo Certbot
sudo certbot delete
# Remover pelo domínio
# Esse comando não solicita confirmação, ao executar o certificado será removido
sudo certbot delete --cert-name meublog.aristides.dev
Diretório dos certificados gerados
Veja que no diretório /etc/letsencrypt
é onde todos os arquivos referente aos certificados são salvos. Dentro dele existe um diretório chamado live
.
root@ubuntu-letsencrypt:/etc/letsencrypt# ls -l
total 40
drwx------ 3 root root 4096 Sep 21 01:11 accounts
drwx------ 3 root root 4096 Sep 21 01:12 archive
-rw-r--r-- 1 root root 121 Oct 10 2019 cli.ini
drwxr-xr-x 2 root root 4096 Sep 21 01:11 csr
drwx------ 2 root root 4096 Sep 21 01:11 keys
drwx------ 3 root root 4096 Sep 21 01:12 live
-rw-r--r-- 1 root root 1143 Sep 21 01:11 options-ssl-nginx.conf
drwxr-xr-x 2 root root 4096 Sep 21 01:12 renewal
drwxr-xr-x 5 root root 4096 Sep 21 01:11 renewal-hooks
-rw-r--r-- 1 root root 424 Sep 21 01:11 ssl-dhparams.pem
Dentro do diretório live
estão salvos os arquivos referente ao seu site, veja que existe um diretório com o nome do meu domínio e dentro existe 4 arquivos com a extensão .pem
que são as chaves e certificados gerados, e que são necessários para a validação do SSL.
root@ubuntu-letsencrypt:/etc/letsencrypt/live# ls -l
total 4
drwxr-xr-x 2 root root 4096 Sep 21 01:12 meublog.aristides.dev
root@ubuntu-letsencrypt:/etc/letsencrypt/live# ls -l meublog.aristides.dev/
total 4
-rw-r--r-- 1 root root 682 Sep 21 01:12 README
lrwxrwxrwx 1 root root 45 Sep 21 01:12 cert.pem -> ../../archive/meublog.aristides.dev/cert1.pem
lrwxrwxrwx 1 root root 46 Sep 21 01:12 chain.pem -> ../../archive/meublog.aristides.dev/chain1.pem
lrwxrwxrwx 1 root root 50 Sep 21 01:12 fullchain.pem -> ../../archive/meublog.aristides.dev/fullchain1.pem
lrwxrwxrwx 1 root root 48 Sep 21 01:12 privkey.pem -> ../../archive/meublog.aristides.dev/privkey1.pem
Os arquivos fullchain.pem
e privkey.pem
são usados dentro do arquivo de configuração do Nginx do seu site em /etc/nginx/sites-available
.
Veja como ficou o arquivo /etc/nginx/sites-available/default.conf
do Nginx após o certificado ser gerado:
# Arquivo: /etc/nginx/sites-available/default.conf
# partes das linhas foram ocultadas
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/meublog.aristides.dev/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/meublog.aristides.dev/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
server {
if ($host = meublog.aristides.dev) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80 default_server;
listen [::]:80 default_server;
server_name meublog.aristides.dev;
return 404; # managed by Certbot
}
Bom pessoal é isso aí. O Let's Encrypt nos ajuda a criar e gerenciar certificados automaticamente, sem esforço nenhum, do jeito que gostamos :)
Se ficou com alguma dúvida fique a vontade para perguntar.
Até a próxima!