Linux

Certificados SSL automatizados com Let's Encrypt

Como configurar certificados SSL gratuitos com Let's Encrypt e renovação automática para todos os seus domínios.

Por WSUL Tecnologia — 16 de abril de 2025  ·  6 min de leitura

Por que SSL é obrigatório

HTTPS não é mais opcional. Navegadores modernos marcam sites HTTP como "não seguro", o Google penaliza sites sem HTTPS no ranking de busca, e usuários estão progressivamente mais atentos a indicadores de segurança. Para órgãos públicos, HTTPS é obrigatório por política de segurança do governo federal.

O Let's Encrypt eliminou a última justificativa para não usar HTTPS: o custo. Certificados gratuitos, válidos, aceitos por todos os navegadores e com renovação automática.

Let's Encrypt

O Let's Encrypt é uma autoridade certificadora (CA) gratuita e automatizada, mantida pela Internet Security Research Group (ISRG). Os certificados são:

  • 100% gratuitos — sem custo por domínio ou por renovação
  • Válidos por 90 dias (renovação automática a cada 60 dias)
  • Aceitos por todos os navegadores modernos
  • Suportam wildcard (*.dominio.com.br) via DNS challenge

Instalando com Certbot

O Certbot é o cliente oficial do Let's Encrypt, desenvolvido pela EFF:

# Ubuntu/Debian
apt install certbot python3-certbot-nginx

# Emitir certificado para domínio com Nginx
certbot --nginx -d wsul.net -d www.wsul.net

# Ou modo standalone (sem servidor web rodando)
certbot certonly --standalone -d meudominio.com.br

# Verificar certificados emitidos
certbot certificates

Certificado wildcard via DNS challenge

Para certificados que cobrem todos os subdomínios:

# Requer plugin DNS específico do provedor
# Exemplo com Cloudflare
apt install python3-certbot-dns-cloudflare

# Criar arquivo de credenciais
cat > /root/.cloudflare.ini << EOF
dns_cloudflare_api_token = SEU_TOKEN_CLOUDFLARE
EOF
chmod 600 /root/.cloudflare.ini

# Emitir wildcard
certbot certonly \
    --dns-cloudflare \
    --dns-cloudflare-credentials /root/.cloudflare.ini \
    -d wsul.net -d "*.wsul.net"

Configuração Nginx com SSL

# /etc/nginx/sites-available/wsul.net
server {
    listen 80;
    server_name wsul.net www.wsul.net;
    return 301 https://;
}

server {
    listen 443 ssl http2;
    server_name wsul.net www.wsul.net;

    ssl_certificate     /etc/letsencrypt/live/wsul.net/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/wsul.net/privkey.pem;

    # Configurações SSL seguras
    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;
    ssl_prefer_server_ciphers off;

    # HSTS
    add_header Strict-Transport-Security "max-age=63072000" always;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/wsul.net/chain.pem;

    root /var/www/wsul.net;
    index index.php index.html;

    location / {
        try_files  / /index.php?;
    }

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME ;
    }
}

Renovação automática

O Certbot configura automaticamente um timer systemd ou cron job para renovar certificados:

# Verificar timer systemd (Ubuntu 20.04+)
systemctl status certbot.timer
systemctl list-timers | grep certbot

# Testar renovação sem aplicar
certbot renew --dry-run

# Renovar manualmente se necessário
certbot renew --force-renewal

O Certbot renova automaticamente certificados com menos de 30 dias de validade. Com validade de 90 dias e renovação a cada 60, há uma janela de 30 dias de segurança.

Monitorar vencimento

# Verificar vencimento de um certificado
echo | openssl s_client -connect wsul.net:443 2>/dev/null \
    | openssl x509 -noout -dates

# Script para alertar certificados vencendo em menos de 30 dias
#!/bin/bash
DOMAIN="wsul.net"
EXPIRY=$(echo | openssl s_client -connect :443 2>/dev/null \
    | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ( - ) / 86400 ))

if [  -lt 30 ]; then
    echo "ALERTA: Certificado de  vence em  dias" \
        | mail -s "SSL vencendo" [email protected]
fi

Configure seu sistema de monitoramento (Zabbix, Grafana, Uptime Kuma) para verificar a validade dos certificados automaticamente. Um certificado vencido derruba o site tão efetivamente quanto uma falha de servidor.

Sua infraestrutura tem esses riscos?

Solicite um diagnóstico gratuito e descubra em quais pontos seu ambiente pode ser melhorado.