SSL grátis com Let's Encrypt e Nginx

HTTPS é obrigatório em 2025. Browsers marcam sites HTTP como "não seguro", o Google penaliza no ranking e APIs modernas exigem TLS. Let's Encrypt fornece certificados SSL gratuitos e automáticos. Com Certbot e Nginx na VPS, o processo leva menos de 5 minutos e a renovação é automática.

Instalar Certbot e obter o primeiro certificado

Certbot é o cliente oficial do Let's Encrypt. Instale via snap para a versão mais recente:

bash
# Instalar Certbot
apt install -y snapd
snap install core && snap refresh core
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

# Obter certificado com configuração automática do Nginx
certbot --nginx -d seudominio.com.br -d www.seudominio.com.br

# Múltiplos subdomínios no mesmo certificado
certbot --nginx -d app.dominio.com.br -d api.dominio.com.br -d admin.dominio.com.br

# Ver certificados emitidos
certbot certificates

Configuração Nginx com SSL otimizado

Configuração SSL segura seguindo as recomendações Mozilla Intermediate:

nginx
# /etc/nginx/sites-available/seudominio.com.br

server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    http2 on;
    server_name seudominio.com.br www.seudominio.com.br;

    ssl_certificate /etc/letsencrypt/live/seudominio.com.br/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/seudominio.com.br/privkey.pem;

    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;

    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;

    ssl_stapling on;
    ssl_stapling_verify on;

    location / {
        proxy_pass http://app:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Certificado wildcard com Cloudflare DNS

Wildcard cobre todos os subdomínios e exige desafio DNS-01:

bash
# Instalar plugin Cloudflare
apt install python3-certbot-dns-cloudflare

# Criar credenciais
cat > /etc/letsencrypt/cloudflare/credentials.ini << 'EOF'
dns_cloudflare_api_token = SEU_TOKEN_AQUI
EOF
chmod 600 /etc/letsencrypt/cloudflare/credentials.ini

# Obter certificado wildcard
certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
  -d seudominio.com.br \
  -d "*.seudominio.com.br"

Renovação automática e monitoramento

Verifique que a renovação automática está configurada e funcionando:

bash
# Ver timer de renovação (systemd)
systemctl status snap.certbot.renew.timer

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

# Ver data de expiração
certbot certificates
# ou
openssl x509 -in /etc/letsencrypt/live/seudominio.com.br/fullchain.pem -noout -dates

# Verificar SSL externamente
curl -I https://seudominio.com.br | grep -i "strict-transport"

SSL com Certbot em stack Docker

Gerencie certificados para containers com o padrão Nginx + Certbot via Compose:

yaml
services:
  nginx:
    image: nginx:alpine
    ports: ["80:80", "443:443"]
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - certbot_conf:/etc/letsencrypt
      - certbot_www:/var/www/certbot

  certbot:
    image: certbot/certbot
    volumes:
      - certbot_conf:/etc/letsencrypt
      - certbot_www:/var/www/certbot
    entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

volumes:
  certbot_conf:
  certbot_www:

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

50 certificados por domínio registrado por semana, 5 duplicados por semana. Para testes: use --staging (limites altos, certificados não-confiáveis). Wildcard conta como um certificado mesmo cobrindo N subdomínios.

Conteúdo misto (mixed content): a página HTTPS carrega recursos via HTTP (imagens, scripts). Inspecione com DevTools (aba Security). Solução: use URLs relativas ou sempre HTTPS nos recursos.

Não. Let's Encrypt exige nome de domínio. Para uso interno sem domínio: gere certificado autoassinado (openssl req -x509) ou use mkcert para desenvolvimento local.

cert.pem: apenas o certificado. chain.pem: certificados intermediários. fullchain.pem: cert + chain (use no Nginx ssl_certificate). privkey.pem: chave privada (nunca compartilhe, use em ssl_certificate_key).

SSL Labs (ssllabs.com/ssltest) dá nota A-F e identifica problemas como protocolos fracos, ciphers inseguros e HSTS ausente. SecurityHeaders.com avalia os headers HTTP. Ambos gratuitos.