SSL grátis na VPS com Let's Encrypt

Let's Encrypt é uma autoridade certificadora gratuita que emite certificados SSL/TLS válidos em segundos. Com Certbot, a geração e renovação são automáticas. A única exigência é que o domínio aponte para o IP da VPS e a porta 80 esteja acessível para o desafio de validação.

Instalar o Certbot via Docker

O jeito mais simples de usar Certbot em uma VPS com Docker é rodar a imagem oficial como container, sem instalar nada no sistema operacional:

bash
# Criar diretórios para certificados
mkdir -p /opt/ssl/certs /opt/ssl/www

# Testar se o Certbot consegue acessar o servidor
docker run --rm \
  -v /opt/ssl/certs:/etc/letsencrypt \
  -v /opt/ssl/www:/var/www/certbot \
  certbot/certbot certificates

# Verificar versão
docker run --rm certbot/certbot --version

Gerar certificado (método webroot)

O método webroot valida o domínio colocando um arquivo em .well-known/acme-challenge/ que o Let's Encrypt busca via HTTP. Requer que o Nginx sirva essa pasta:

bash
# Nginx deve ter essa configuração no bloco server:
# location /.well-known/acme-challenge/ {
#     root /var/www/certbot;
# }

# Gerar certificado (substitua domínio e e-mail)
docker run --rm \
  -v /opt/ssl/certs:/etc/letsencrypt \
  -v /opt/ssl/www:/var/www/certbot \
  certbot/certbot certonly \
  --webroot \
  --webroot-path=/var/www/certbot \
  --email seu@email.com \
  --agree-tos \
  --no-eff-email \
  -d seudominio.com.br \
  -d www.seudominio.com.br

# Certificados em:
ls /opt/ssl/certs/live/seudominio.com.br/
# cert.pem  chain.pem  fullchain.pem  privkey.pem

Configurar Nginx para HTTPS

Após gerar o certificado, atualize o bloco server do Nginx para escutar em 443 e redirecionar HTTP:

nginx
server {
    listen 80;
    server_name seudominio.com.br www.seudominio.com.br;

    location /.well-known/acme-challenge/ {
        root /var/www/certbot;
    }
    location / {
        return 301 https://seudominio.com.br$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_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;

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

    # ... configuração do seu app aqui
}

Renovação automática via cron

Certificados Let's Encrypt expiram em 90 dias e podem ser renovados a partir de 30 dias antes. Configure a renovação automática:

bash
# Crontab do root (crontab -e)
# Renova às 3h da manhã, verifica diariamente (só renova se < 30 dias)
0 3 * * * docker run --rm \
  -v /opt/ssl/certs:/etc/letsencrypt \
  -v /opt/ssl/www:/var/www/certbot \
  certbot/certbot renew --quiet && \
  docker exec nginx nginx -s reload

# Testar sem renovar de verdade
docker run --rm \
  -v /opt/ssl/certs:/etc/letsencrypt \
  -v /opt/ssl/www:/var/www/certbot \
  certbot/certbot renew --dry-run

Método alternativo: Certbot standalone

Se não tiver Nginx rodando na porta 80, use o modo standalone, o Certbot sobe um servidor HTTP temporário para o desafio:

bash
# Para temporariamente (se Nginx estiver rodando, pare antes)
docker stop nginx

# Gerar certificado com standalone
docker run --rm \
  -v /opt/ssl/certs:/etc/letsencrypt \
  -p 80:80 \
  certbot/certbot certonly \
  --standalone \
  --email seu@email.com \
  --agree-tos \
  --no-eff-email \
  -d seudominio.com.br

# Reiniciar Nginx
docker start nginx

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

Certificados DV (Domain Validated) do Let's Encrypt são tecnicamente equivalentes aos pagos de mesma categoria, mesma criptografia, mesmo nível de validação de domínio. A diferença está em: (1) certificados OV/EV pagos validam a identidade da empresa; (2) certificados pagos têm SLAs e suporte; (3) alguns contextos legais exigem certificados pagos. Para sites, APIs e apps: Let's Encrypt é suficiente.

Segundos a minutos. O processo de validação webroot ou standalone é quase instantâneo, o Let's Encrypt verifica o arquivo ou responde ao servidor em tempo real. O único gargalo é a propagação DNS se o domínio foi recém-apontado para a VPS.

5 certificados por domínio por semana (para o mesmo conjunto de domínios). Em testes, use --staging para não consumir o limite de produção. Renovações não contam para o rate limit.

Certificados wildcard (*.dominio.com.br) exigem o desafio DNS-01, não é possível usar webroot ou standalone. Você precisa criar um registro TXT no DNS do domínio com o valor fornecido pelo Certbot. Cloudflare, Route53 e outros provedores têm plugins para automatizar isso.

Sim. O NPM emite e renova certificados Let's Encrypt com um clique pela interface web, sem precisar rodar o Certbot manualmente. Se você usa NPM, não precisa deste processo manual, o NPM cuida de tudo.