DevOps

Certbot / Let's Encrypt com Apache

Guia completo de Certbot com Apache: instalação, certificados, renovação, wildcard DNS, HSTS e troubleshooting.

HTTPS grátis, automático e seguro. O Let's Encrypt democratizou o SSL e o Certbot é a ferramenta que torna tudo simples. Com Apache, a configuração é quase automática — quase.

Antes do Let's Encrypt, ter HTTPS num site custava dinheiro (certificados de terceiros) ou paciência (auto-assinados + confiança manual). Hoje, qualquer site pode ter HTTPS válido em minutos, sem pagar um cêntimo.

O Certbot é o cliente oficial da Let's Encrypt. Para Apache, ele faz tudo: obtém o certificado, configura o VirtualHost, ativa o redirecionamento HTTP→HTTPS, e ainda trata da renovação automática. Mas há nuances que é importante conhecer — desde wildcards com DNS-01 até troubleshooting de rate limits.

Vou guiar-te por toda a instalação do Certbot em Debian e Ubuntu, desde a obtenção automática com certbot --apache até à renovação, wildcards com validação DNS, troubleshooting de rate limits e boas práticas como OCSP stapling e HSTS.

Fluxo Certbot + Let's Encrypt

Como o Certbot comunica com a Let's Encrypt para obter e renovar certificados


Instalação do Certbot no Debian/Ubuntu

# Adicionar repositório oficial (recomendado para versão estável mais recente)
sudo apt update
sudo apt install certbot python3-certbot-apache

# Ou, se preferires o snap (versão mais atualizada):
sudo snap install certbot --classic
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Copy

Nota: A versão do apt nos repositórios Debian estáveis pode estar desatualizada. Se usas Debian 12, o pacote python3-certbot-apache é geralmente suficiente. Para Ubuntu, o snap é a via recomendada pela própria Let's Encrypt.


Obter e configurar o certificado

Assumindo que o Apache já está configurado com um VirtualHost para o teu domínio (mesmo que só HTTP), o comando é simples:

# Obter certificado + configurar Apache automaticamente
sudo certbot --apache -d exemplo.pt -d www.exemplo.pt

# Se quiseres só obter o certificado sem alterar a config Apache:
sudo certbot certonly --apache -d exemplo.pt

# Se ainda não tens o domínio apontado ou estás numa fase de testes:
sudo certbot certonly --manual -d exemplo.pt
Copy

O que o certbot --apache faz automaticamente:

  1. Verifica que o domínio está acessível na porta 80
  2. Contacta a Let's Encrypt e obtém o desafio HTTP-01
  3. Coloca um ficheiro de verificação em /.well-known/acme-challenge/
  4. Valida o desafio com o servidor ACME
  5. Obtém os certificados (fullchain.pem, privkey.pem, cert.pem, chain.pem)
  6. Atualiza a configuração do Apache para usar SSL
  7. Ativa o redirecionamento 301 de HTTP para HTTPS
  8. Configura o timer de renovação automática

Renovação automática

Os certificados Let's Encrypt duram 90 dias. Mas não precisas de fazer nada — o Certbot instala um systemd timer que corre duas vezes por dia e renova automaticamente se faltarem menos de 30 dias.

# Verificar o timer
systemctl list-timers | grep certbot

# Testar renovação manual (dry-run — não altera nada)
sudo certbot renew --dry-run

# Ver estado de todos os certificados
sudo certbot certificates
Copy

Importante: Corre sempre certbot renew --dry-run depois de instalares. É a única forma de garantires que a renovação automática vai funcionar. Já vi servidores com certificados expirados porque o --dry-run nunca foi testado.


Wildcard certificates com validação DNS

Precisas de um certificado que cubra *.exemplo.pt? A validação HTTP-01 não funciona para wildcards. Tens de usar DNS-01 — criar um registo TXT no DNS para provar que és dono do domínio.

# Obter wildcard com validação manual DNS
sudo certbot certonly --manual --preferred-challenges dns -d *.exemplo.pt -d exemplo.pt
Copy

O Certbot vai mostrar-te um registo TXT para adicionares ao DNS. Algo como:

_acme-challenge.exemplo.pt IN TXT "abcdef1234567890"
Copy

Para automatizar isto, usa um plugin DNS. Por exemplo, para Cloudflare:

# Instalar plugin Cloudflare para Certbot
sudo apt install python3-certbot-dns-cloudflare
# Criar ficheiro de credentials (sudo tee, não "sudo cat >": o ">" corre
# no teu shell, sem privilégios, antes de o sudo entrar em ação)
sudo mkdir -p /etc/letsencrypt
sudo tee /etc/letsencrypt/cloudflare.ini > /dev/null <<'EOF'
dns_cloudflare_api_token = o_teu_token_aqui
EOF
sudo chmod 600 /etc/letsencrypt/cloudflare.ini
# Obter wildcard
sudo certbot certonly --dns-cloudflare \
    --dns-cloudflare-credentials /etc/letsencrypt/cloudflare.ini \
    -d *.exemplo.pt -d exemplo.pt
Copy

Troubleshooting comum

ProblemaCausaSolução
Porta 80 bloqueadaFirewall ou ISP bloqueia a porta 80Usa validação DNS-01 em vez de HTTP-01
Rate limit excedidoAté 50 certificados por domínio registado a cada 7 dias (limite global, não por conta)Espera ou usa wildcard para reduzir o número de certificados
Demasiadas renovaçõesAté 5 certificados com o mesmo conjunto de domínios a cada 7 dias (as renovações normais, via ARI, ficam fora deste limite)Usa --dry-run para testar, não forces renovações reais
Certificado não renovaApache não reinicia após renovaçãoAdiciona --deploy-hook "systemctl reload apache2"
DNS não propagaRegisto TXT demora a propagarCom um plugin DNS, usa --dns-cloudflare-propagation-seconds 60 (ou o equivalente do teu plugin); no modo manual, espera antes de confirmares o desafio

Boas práticas de segurança

# 1. Must-Staple e OCSP: a Let's Encrypt desligou o OCSP em agosto de 2025
#    (passou a usar só CRLs). Desde maio de 2025 os certificados novos já
#    não trazem URL de OCSP, e os pedidos com must-staple falham. As
#    diretivas abaixo (SSLUseStapling) continuam a existir no Apache e
#    funcionam com certificados de outras CAs que ainda tenham OCSP —
#    não fazem nada de útil com um certificado da Let's Encrypt.
# No Apache, para certificados de outra CA com OCSP:
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# 2. HSTS (HTTP Strict Transport Security) — isto continua válido
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
# 3. Renew hook — força reload do Apache após renovação
sudo certbot renew --deploy-hook "systemctl reload apache2"
Copy

OCSP Stapling

Como o OCSP Stapling acelera a validação de certificados


Recapitulando

  • Instala com apt install certbot python3-certbot-apache
  • certbot --apache -d exemplo.pt para tudo automático
  • Renovação automática via systemd timer — testa com --dry-run
  • Wildcards com DNS-01 (plugin Cloudflare ou manual)
  • Troubleshooting: portas, rate limits, renewal hooks
  • HSTS para forçar HTTPS no browser (o OCSP Stapling e o Must-Staple já não se aplicam a certificados da Let's Encrypt, que descontinuou o OCSP em 2025)

HTTPS grátis é uma das maiores conquistas recentes da internet. O Let's Encrypt e o Certbot tornaram-no acessível a qualquer pessoa com um domínio. Se ainda tens sites em HTTP, este é o empurrão que precisavas.

Experimenta correr o certbot --apache num site de teste e vê como é mágico ver o cadeado verde a aparecer no browser.

Recursos adicionais

Partilhar

Comentários 0

Ainda sem comentários — sê o primeiro.