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
    Dica
    Você pode adicionar múltiplos -d para cobrir subdomínios diferentes no mesmo certificado (SAN — Subject Alternative Names). Limite de 100 SANs por certificado.

    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
    Dica
    --dry-run simula a renovação sem emitir certificado novo — não consome o rate limit do Let's Encrypt (5 certificados por domínio por semana).

    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
    Atenção
    O modo standalone requer parar o Nginx durante a validação (downtime de ~30 segundos). Para produção prefira o método webroot que não causa downtime.

    $ runstack deploy --plan starter

    Não quer configurar manualmente?

    Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.

    Perguntas frequentes