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.comao 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.coma apontar para o endereço IP público do seu servidor.
- Um registo A com
- Um registo A com
www.example.coma 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 coreSe 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 certbotDepois disso, pode instalar o pacote certbot:
sudo snap install --classic certbotFinalmente, 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/certbotAlternativa (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-nginxA 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.comEncontre 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 -tSe 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 nginxO 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 statusProvavelmente 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 statusStatus: 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.comIsto 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-leOs 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.timerPara testar o processo de renovação, pode fazer uma simulação com o certbot:
sudo certbot renew --dry-runSe 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)
- Gerador de Configuração SSL da Mozilla (
- 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ática | Por que é importante? | Como candidatar-se |
|---|---|---|
| Utilize 301 de HTTP para HTTPS | Os utilizadores acedem rapidamente ao URL seguro | O Certbot escreve automaticamente os redirecionamentos, ou adicione um servidor na porta 80 que devolva 301 https://$host$request_uri |
| Minimizar saltos de redirecionamento | Menos viagens de ida e volta=pintura inicial mais rápida | Aponte os links DNS/canónicos para o host HTTPS final; evite cadeias http → www → https |
| Servir todos os recursos via HTTPS | Previne avisos de conteúdo misto e falhas na interface | Auditar com o painel de Segurança do DevTools; atualizar URLs de CDNs/ativos para https:// |
| Ativar HTTP/2 e HTTP/3 | Entrega multiplexada mais rápida, melhor desempenho móvel | No Nginx, listen 443 ssl http2; e, se suportado, http3/QUIC na porta 443/udp |
| Ativar a retoma de sessão TLS | Visitas de repetição mais rápidas | Certifique-se de que ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; |
| Ativar o OCSP stapling | Validação de certificados mais rápida e fiável | ssl_stapling on; ssl_stapling_verify on; com resolvedor válido |
| Preferir Brotli/Gzip | Payloads mais pequenos para HTML/CSS/JS | Ative brotli on; (se o módulo estiver presente) e gzip on; como alternativa |
| Definir URLs canónicas HTTPS claras | Evite conteúdo duplicado e URLs confusas | Use <link rel="canonical" href="https://example.com/..."> e atualize os sitemaps |
| Consolidar www vs domínio raiz | Endereçamento previsível e menos redirecionamentos | Escolha um nome de anfitrião; redirecione o outro permanentemente para ele |
| Páginas amigáveis de erro/manutenção TLS | Reduzir o abandono durante incidentes | Página de erro personalizada error_page 497/403/502/503 com passos seguintes claros |
| Monitorizar renovações e falhas | Prevenir bloqueios súbitos devido à expiração de certificados | Alerta nos logs do certbot; verificações externas; entregabilidade de e-mail verificada |
| Introduzir o HSTS com cautela | Evite bloqueios acidentais durante a implementação | Comece 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.comewww.example.comapontam para o endereço IP público correto. server_nameNginx incorreto: O Certbot localiza o bloco do servidor peloserver_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-rundurante os testes e varie os subdomínios se necessário. - Conflitos entre Snap e APT: Remova o
certbotmais 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.comEste 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.comSerá 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 -enddateEm 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 -subjectTambé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.
