Pesquisa de sites

Como Proteger o Nginx com o Let's Encrypt no Ubuntu


Introdução

Let’s Encrypt é uma Autoridade Certificadora (CA) que fornece uma forma acessível de obter e instalar certificados TLS/SSL gratuitos, permitindo assim HTTPS encriptado em servidores web. Simplifica o processo ao fornecer um cliente de software, o Certbot, que procura automatizar a maioria (senão todos) dos passos necessários. Atualmente, todo o processo de obtenção e instalação de um certificado é totalmente automatizado tanto no Apache como no Nginx.

Neste tutorial, irá usar o Certbot para obter um certificado SSL gratuito para o Nginx no Ubuntu e configurar o seu certificado para renovar automaticamente.

Principais Conclusões

  • Use o plugin Nginx do Certbot para obter e instalar certificados gratuitos da Let’s Encrypt em minutos.
  • Funciona no Ubuntu 22.04 (Jammy), 24.04 (Noble) e 25.04 (Lunar).
  • Ativar renovação automática; os certificados são válidos por 90 dias e renovam-se automaticamente.
  • Fortaleça o HTTPS com HSTS e conjuntos de cifragem modernos; valide com o SSL Labs.
  • Certifique-se de que os registos A do DNS e as portas 80/443 estão acessíveis; a maioria das falhas de validação está relacionada com a rede ou o DNS.

Pré-requisitos

Para seguir este tutorial, você precisará de:

  • Um servidor Ubuntu configurado seguindo este tutorial de configuração inicial de servidor para Ubuntu, incluindo um utilizador não-root com privilégios sudo e um firewall.

  • Um nome de domínio registado. Este tutorial irá usar example.com ao longo do mesmo. Pode comprar um nome de domínio na Namecheap, ou usar o Google Domains ou o seu registador de domínios preferido.

  • Ambos os seguintes registos DNS estão configurados para o seu servidor. Se estiver a utilizar o Linux-Console.net, consulte a nossa documentação de DNS para obter detalhes sobre como os adicionar.

    • Um registo A com example.com a apontar para o endereço IP público do seu servidor.
    • Um registo A com www.example.com a apontar para o endereço IP público do seu servidor.
  • O Nginx foi instalado seguindo o guia Como Instalar o Nginx no Ubuntu. Certifique-se de que tem um bloco de servidor para o seu domínio. Este tutorial irá usar /etc/nginx/sites-available/example.com como exemplo.

Passo 1 — Instalar o Certbot

O Certbot recomenda utilizar o seu pacote snap para instalação. Os pacotes snap funcionam na quase totalidade das distribuições Linux, mas exigem que tenha instalado o snapd primeiro para poder gerir pacotes snap. O Ubuntu já inclui suporte a snap (22.04, 24.04, 25.04). Comece por garantir que o snapd está atualizado:

sudo snap install core; sudo snap refresh core

Se estiver a trabalhar num servidor que anteriormente tinha uma versão mais antiga do certbot instalada, deve removê-la antes de prosseguir:

sudo apt remove certbot

Depois disso, pode instalar o pacote certbot:

sudo snap install --classic certbot

Finalmente, pode ligar o comando certbot a partir do diretório de instalação do snap ao seu PATH, de forma a poder executá-lo apenas digitando certbot. Isto não é necessário em todos os sistemas, mas os snaps tendem a ser menos intrusivos por padrão, pelo que não entram em conflito com outros pacotes do sistema por acidente:

sudo ln -s /snap/bin/certbot /usr/bin/certbot

Alternativa (APT): Em alguns ambientes sem snapd, pode instalar a partir dos repositórios do Ubuntu:

sudo apt update

sudo apt install -y certbot python3-certbot-nginx

A distribuição snap continua a ser o método de instalação recomendado pela equipa Certbot para aceder às funcionalidades mais recentes e às atualizações atempadas.

Agora que temos o Certbot instalado, vamos executá-lo para obter o nosso certificado.

Passo 2 — Confirmar a Configuração do Nginx

O Certbot precisa ser capaz de encontrar o bloco server correto na sua configuração do Nginx para poder configurar automaticamente o SSL. Especificamente, ele faz isso procurando uma diretiva server_name que corresponda ao domínio para o qual solicita um certificado.

Se seguiu o passo de configuração do bloco de servidor no tutorial de instalação do Nginx, deverá ter um bloco de servidor para o seu domínio em /etc/nginx/sites-available/example.com com a diretiva server_name já configurada correctamente.

Para verificar, abra o ficheiro de configuração do seu domínio usando nano ou o seu editor de texto favorito:

sudo nano /etc/nginx/sites-available/example.com

Encontre a linha existente server_name. Deve parecer com isto:

...
server_name example.com www.example.com;
...

Se assim for, saia do seu editor e avance para o próximo passo.

Se não o fizer, atualize-o para corresponder. Depois, guarde o ficheiro, feche o seu editor e verifique a sintaxe das suas alterações de configuração:

sudo nginx -t

Se receber um erro, reabra o ficheiro do bloco de servidor e verifique se há algum erro de digitação ou caracteres em falta. Assim que a sintaxe do ficheiro de configuração estiver correta, recarregue o Nginx para aplicar a nova configuração:

sudo systemctl reload nginx

O Certbot agora pode encontrar o bloco server correto e atualizá-lo automaticamente.

De seguida, vamos atualizar o firewall para permitir o tráfego HTTPS.

Passo 3 — Permitir HTTPS através do firewall

Se tiver o firewall ufw ativado, conforme recomendado pelos guias de pré-requisitos, será necessário ajustar as definições para permitir o tráfego HTTPS. Felizmente, o Nginx regista alguns perfis no ufw durante a instalação.

Pode ver a configuração atual digitando:

sudo ufw status

Provavelmente ficará assim, o que significa que apenas o tráfego HTTP é permitido para o servidor web:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
Nginx HTTP                 ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Para permitir adicionalmente o tráfego HTTPS, permita o perfil completo do Nginx e elimine a permissão redundante do perfil HTTP do Nginx:

sudo ufw allow 'Nginx Full'

sudo ufw delete allow 'Nginx HTTP'

O seu estado agora deverá parecer assim:

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx Full                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx Full (v6)            ALLOW       Anywhere (v6)

De seguida, vamos executar o Certbot e obter os nossos certificados.

Passo 4 — Obtenção de um Certificado SSL

O Certbot oferece várias formas de obter certificados SSL através de plugins. O plugin Nginx encarrega-se de reconfigurar o Nginx e recarregar a configuração sempre que necessário. Para usar este plugin, digite o seguinte:

sudo certbot --nginx -d example.com -d www.example.com

Isto executa o certbot com o plugin --nginx, usando -d para especificar os nomes de domínio para os quais gostaríamos que o certificado fosse válido.

Ao executar o comando, será solicitado que introduza um endereço de email e aceite os termos de serviço. Após fazê-lo, deverá ver uma mensagem a informar que o processo foi bem-sucedido e onde os seus certificados estão armazenados:

IMPORTANT NOTES:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/your_domain/fullchain.pem
Key is saved at: /etc/letsencrypt/live/your_domain/privkey.pem
This certificate expires on 2022-06-01.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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

Os seus certificados estão descarregados, instalados e carregados, e a configuração do Nginx irá agora redirecionar automaticamente todos os pedidos web para https://. Experimente recarregar o seu site e repare no indicador de segurança do seu navegador. Este deverá indicar que o site está devidamente protegido, normalmente com um ícone de cadeado. Se testar o seu servidor usando o SSL Labs Server Test, irá receber uma classificação A.

Vamos terminar testando o processo de renovação.

Passo 5 — Verificar a Renovação Automática do Certbot

Os certificados da Let’s Encrypt são válidos apenas por noventa dias. Isto serve para incentivar os utilizadores a automatizar o processo de renovação dos certificados. O pacote certbot que instalámos trata disto por nós, adicionando um temporizador do systemd que será executado duas vezes por dia e renovará automaticamente qualquer certificado que esteja a menos de trinta dias de expirar.

Pode consultar o estado do temporizador com systemctl:

sudo systemctl status snap.certbot.renew.service
○ snap.certbot.renew.service - Service for snap application certbot.renew
     Loaded: loaded (/etc/systemd/system/snap.certbot.renew.service; static)
     Active: inactive (dead)
TriggeredBy: ● snap.certbot.renew.timer

Para testar o processo de renovação, pode fazer uma simulação com o certbot:

sudo certbot renew --dry-run

Se não vir erros, está tudo pronto. Quando necessário, o Certbot irá renovar os seus certificados e reiniciar o Nginx para aplicar as alterações. Se o processo de renovação automática falhar, o Let’s Encrypt enviará uma mensagem para o e-mail que especificou, avisando-o quando o seu certificado estiver prestes a expirar.

Se preferir hooks, pode adicionar um post-hook para recarregar o Nginx apenas quando um certificado for renovado:

sudo certbot renew --dry-run --post-hook "systemctl reload nginx"

Em sistemas que utilizam pacotes APT, uma tarefa cron pode tratar das renovações; com snap, um temporizador do systemd (snap.certbot.renew.timer) é executado duas vezes por dia.

Configuração das Melhores Práticas de HTTPS (HSTS, Cifrões, Redirecionamentos)

Reforce a sua configuração TLS para reduzir os riscos de rebaixamento e de conteúdo misto.

  • Ativar HSTS para forçar HTTPS nos navegadores suportados:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
  • Prefira protocolos e cifras TLS modernos (ajuste de acordo com o seu perfil de risco):
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
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';
  • Redirecionar HTTP para HTTPS (o Certbot pode adicionar isto automaticamente):
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
  • Valide a sua configuração com ferramentas da indústria:

    • Gerador de Configuração SSL da Mozilla (https://ssl-config.mozilla.org)
    • Teste de Servidor SSL Labs (https://www.ssllabs.com/ssltest/)

Nota: Tenha cuidado com o HSTS na primeira ativação. Se definir preload, submeta o seu domínio apenas depois de confirmar uma configuração HTTPS estável para todos os subdomínios.

PráticaPor que é importante?Como candidatar-se
Utilize 301 de HTTP para HTTPSOs utilizadores acedem rapidamente ao URL seguroO Certbot escreve automaticamente os redirecionamentos, ou adicione um servidor na porta 80 que devolva 301 https://$host$request_uri
Minimizar saltos de redirecionamentoMenos viagens de ida e volta=pintura inicial mais rápidaAponte os links DNS/canónicos para o host HTTPS final; evite cadeias http → www → https
Servir todos os recursos via HTTPSPrevine avisos de conteúdo misto e falhas na interfaceAuditar com o painel de Segurança do DevTools; atualizar URLs de CDNs/ativos para https://
Ativar HTTP/2 e HTTP/3Entrega multiplexada mais rápida, melhor desempenho móvelNo Nginx, listen 443 ssl http2; e, se suportado, http3/QUIC na porta 443/udp
Ativar a retoma de sessão TLSVisitas de repetição mais rápidasCertifique-se de que ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d;
Ativar o OCSP staplingValidação de certificados mais rápida e fiávelssl_stapling on; ssl_stapling_verify on; com resolvedor válido
Preferir Brotli/GzipPayloads mais pequenos para HTML/CSS/JSAtive brotli on; (se o módulo estiver presente) e gzip on; como alternativa
Definir URLs canónicas HTTPS clarasEvite conteúdo duplicado e URLs confusasUse <link rel="canonical" href="https://example.com/..."> e atualize os sitemaps
Consolidar www vs domínio raizEndereçamento previsível e menos redirecionamentosEscolha um nome de anfitrião; redirecione o outro permanentemente para ele
Páginas amigáveis de erro/manutenção TLSReduzir o abandono durante incidentesPágina de erro personalizada error_page 497/403/502/503 com passos seguintes claros
Monitorizar renovações e falhasPrevenir bloqueios súbitos devido à expiração de certificadosAlerta nos logs do certbot; verificações externas; entregabilidade de e-mail verificada
Introduzir o HSTS com cautelaEvite bloqueios acidentais durante a implementaçãoComece sem preload; adicione subdomínios gradualmente; verifique antes de submeter o preload

Problemas Comuns e Soluções

  • Falhas no desafio ACME HTTP-01: Certifique-se de que a porta 80 está acessível a partir da internet e não é bloqueada por um firewall ou balanceador de carga upstream.
  • Incompatibilidade de DNS: Confirme se os registos A/AAAA de example.com e www.example.com apontam para o endereço IP público correto.
  • server_name Nginx incorreto: O Certbot localiza o bloco do servidor pelo server_name; verifique se corresponde aos domínios solicitados.
  • Limites de taxa: Pedidos falhados repetidos podem atingir os limites de taxa da Let’s Encrypt. Utilize --dry-run durante os testes e varie os subdomínios se necessário.
  • Conflitos entre Snap e APT: Remova o certbot mais antigo instalado via APT antes de instalar o Snap para evitar conflitos de caminhos.

Perguntas Frequentes

1. O que é o Let’s Encrypt e como funciona com o Nginx?

Let’s Encrypt é uma CA gratuita que verifica o controlo do domínio e emite certificados SSL/TLS através do protocolo ACME. O Certbot automatiza a validação do domínio (HTTP‑01 na maioria dos casos, DNS‑01 para coringas), a emissão de certificados, a configuração do Nginx e as renovações. Com o plugin do Nginx, o Certbot atualiza o seu bloco server e grava os ficheiros de certificado em /etc/letsencrypt/live/seu_dominio/.

2. Preciso de um nome de domínio para usar o SSL da Let’s Encrypt?

Sim. Certificados confiáveis publicamente exigem um domínio registado com DNS público apontando para o seu servidor — nomes de host apenas com IP ou privados não são suportados. Utilize registos A/AAAA para cada nome de host que solicitar. Certificados curinga (por exemplo, *.example.com) exigem validação DNS‑01 e acesso para editar o DNS.

3. Como instalo o Certbot no Ubuntu para o Nginx?

Use snap (recomendado): sudo snap install --classic certbot && sudo ln -s /snap/bin/certbot /usr/bin/certbot. Alternativamente, sudo apt install certbot python3-certbot-nginx.

O pacote snap recebe atualizações mais rapidamente e inclui o plugin Nginx. Verifique a versão com certbot --version. Se o snap não estiver disponível, o APT funciona, mas pode ter atraso nas funcionalidades; certifique-se de que python3-certbot-nginx está instalado para que o Certbot possa editar o Nginx automaticamente.

4. Posso proteger vários domínios ou subdomínios com um único certificado?

Sim, a Let’s Encrypt permite-lhe proteger múltiplos domínios e subdomínios usando um único certificado, conhecido como certificado SAN (Subject Alternative Name). Em vez de solicitar e gerir certificados separados para cada nome de anfitrião, pode combiná-los todos num único certificado—tornando a gestão e a renovação muito mais simples.

Como fazer:
Ao executar o Certbot, pode especificar cada domínio ou subdomínio que deseja incluir no seu certificado repetindo a opção -d para cada um. Por exemplo:

sudo certbot --nginx -d example.com -d www.example.com -d api.example.com

Este comando irá obter um certificado que é válido para todos os três nomes (example.com, www.example.com, api.example.com). O Certbot atualizará automaticamente a sua configuração do Nginx para utilizar o novo certificado em todos os domínios listados.

E quanto aos domínios curinga?
Se quiser um certificado que cubra todos os subdomínios (como anything.example.com), pode usar um domínio curinga. Isto requer validação DNS-01 (provando que tem controlo sobre a sua zona DNS), normalmente adicionando um registo TXT especial ao seu fornecedor de DNS. Por exemplo:

sudo certbot --manual --preferred-challenges dns -d *.example.com -d example.com

Será solicitado que crie registos DNS específicos durante este processo.

Outras coisas a saber:

  • Deve garantir que todos os domínios especificados estejam corretamente apontados para o seu servidor antes de executar o Certbot.
  • Esteja ciente dos limites de taxa do Let’s Encrypt: tente agrupar domínios relacionados em o menor número possível de certificados, para minimizar a chance de atingir estes limites.
  • Ao renovar, o Certbot manterá todos os domínios originais juntos, a menos que solicite um novo conjunto.

Usar múltiplas opções -d com o Certbot é a forma recomendada de abranger vários domínios/subdomínios. Certificados com muitos SANs são ideais para sites e APIs no mesmo projeto ou servidor.

5. Como posso confirmar se a renovação automática está a funcionar?

Execute sudo systemctl status snap.certbot.renew.timer (snap) e sudo certbot renew --dry-run. Verifique os registos em /var/log/letsencrypt/. Também pode verificar a validade:

openssl x509 -in /etc/letsencrypt/live/your_domain/fullchain.pem -noout -enddate

Em caso de sucesso, as renovações ocorrem automaticamente quando um certificado está a 30 dias do vencimento e o Nginx é recarregado.

6. Como configurar o Nginx para usar o certificado Let’s Encrypt?

O Certbot configura automaticamente o Nginx com o certificado Let’s Encrypt. As diretivas típicas no seu bloco de servidor TLS são:

ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;

Valide com sudo nginx -t e aplique com sudo systemctl reload nginx.

7. Como posso testar se a minha configuração HTTPS está correta?

Utilize testes externos e verificações do cliente:

  • Teste de Servidor SSL Labs: https://www.ssllabs.com/ssltest/
  • Guia do Gerador de Configuração SSL da Mozilla: https://ssl-config.mozilla.org
  • Verificações rápidas:
curl -I http://example.com      # Expect 301 to https

curl -I https://example.com     # Confirm 200 and HSTS if enabled

openssl s_client -connect example.com:443 -servername example.com -tls1_3 < /dev/null | openssl x509 -noout -dates -issuer -subject

Também abra as Ferramentas de Programador → Segurança para identificar avisos de conteúdo misto.

8. Como posso configurar a renovação automática dos certificados Let’s Encrypt?

Com instalações via snap, um temporizador do systemd (snap.certbot.renew.timer) é executado duas vezes por dia e renova certificados que estão prestes a expirar. Verifique com systemctl status e simule com sudo certbot renew --dry-run. Se precisar de hooks, use:

sudo certbot renew --post-hook "systemctl reload nginx"

Certifique-se de que as portas 80/443 estão acessíveis, que o DNS está correto e que o email de notificação é monitorizado para que os problemas de renovação sejam detetados rapidamente.

Conclusão

Neste tutorial, instalou o cliente Let’s Encrypt certbot, descarregou certificados SSL para o seu domínio, configurou o Nginx para usar esses certificados e configurou a renovação automática dos certificados. Também reforçou a sua configuração TLS com HSTS e cifras modernas e reviu os passos comuns de resolução de problemas. Se tiver mais perguntas sobre o uso do Certbot, a documentação oficial é um bom ponto de partida.

Olhando para o futuro: Para equipas que gerem muitos domínios, considerem a automação de infraestrutura como código (por exemplo, roles do Ansible para Nginx + Certbot), desafios DNS-01 para certificados wildcard e monitorização proativa de certificados com alertas — áreas bem adequadas para um guia avançado separado.

Leitura adicional

  • Como Instalar o Nginx no Ubuntu: Instalar o Nginx, gerir o serviço, abrir o firewall e configurar blocos de servidor.
  • Como proteger o Nginx com Let’s Encrypt no Ubuntu 20.04: Variante mais antiga do Ubuntu abordando a emissão com Certbot, redirecionamentos HTTPS e renovação automática.
  • Como Adquirir um Certificado Let’s Encrypt Usando Validação DNS: Utilize desafios DNS‑01 (via acme‑dns/Certbot) para certificados curinga ou quando a validação HTTP não for possível.
  • Como Corrigir Erros Comuns do Let’s Encrypt: Resolver problemas com desafios ACME, acessibilidade DNS/HTTP, limites de taxa e problemas de renovação.

Obrigado por aprender com a comunidade Linux-Console.net.