HTTPS Automático com Traefik e Let’s Encrypt: Certificados SSL Gratuitos

O cadeado verde na barra de endereços, garantido pelo protocolo HTTPS, é um símbolo universal de confiança e segurança para os usuários. No entanto, para equipes de DevOps e infraestrutura, o gerenciamento de certificados SSL/TLS — sua compra, configuração, instalação e, principalmente, renovação — sempre foi um processo manual, repetitivo e propenso a erros. Um certificado expirado pode tirar um serviço do ar e causar prejuízos significativos. É para resolver essa dor de cabeça que a combinação poderosa de Traefik e Let’s Encrypt se tornou a solução padrão para automação de HTTPS em ambientes nativos da nuvem.

Vamos demonstrar, passo a passo, como configurar o Traefik como um proxy reverso inteligente que não apenas roteia o tráfego para seus contêineres, mas também provisiona e renova automaticamente certificados SSL gratuitos da Let’s Encrypt. Ao final deste artigo, você será capaz de implementar uma solução “configure e esqueça” para ter HTTPS em todas as suas aplicações, de forma robusta e escalável.

O que é Traefik? O Proxy Reverso Nativo da Nuvem

Traefik é um moderno proxy reverso e balanceador de carga projetado especificamente para o ecossistema de microsserviços e contêineres. Diferente de proxies tradicionais como Nginx ou Apache, que dependem de arquivos de configuração estáticos que precisam ser atualizados e recarregados a cada mudança, o Traefik é dinâmico.

Sua principal característica é a descoberta automática de serviços. O Traefik se conecta diretamente às APIs de orquestradores como Docker, Kubernetes, Swarm ou Consul e detecta automaticamente quando novos serviços (contêineres) são iniciados ou parados. Com base em metadados (labels no Docker ou annotations no Kubernetes) anexados a esses serviços, o Traefik cria e atualiza suas próprias regras de roteamento em tempo real, sem a necessidade de intervenção manual ou reinicializações. Isso o torna a ferramenta perfeita para ambientes efêmeros e altamente dinâmicos.

O que é Let’s Encrypt? Democratizando o HTTPS

Let’s Encrypt é uma Autoridade Certificadora (CA) gratuita, automatizada e aberta, mantida pela Internet Security Research Group (ISRG). Sua missão é tornar a criptografia TLS (a tecnologia por trás do HTTPS) onipresente na internet, eliminando as barreiras de custo e complexidade técnica.

Para fazer isso, a Let’s Encrypt utiliza o protocolo ACME (Automated Certificate Management Environment). Esse protocolo permite que um software cliente, rodando em seu servidor, prove para a Let’s Encrypt que ele controla um determinado domínio. Uma vez provado, o cliente pode solicitar, renovar e revogar certificados para esse domínio de forma totalmente automatizada.

A Sinergia Perfeita: Como Traefik e Let’s Encrypt Trabalham Juntos

A integração nativa com a Let’s Encrypt é uma das funcionalidades mais aclamadas do Traefik. O fluxo de trabalho é elegantemente simples e totalmente automatizado:

  1. Detecção: Você inicia um novo contêiner de aplicação com um label especificando o domínio que ele deve responder (ex: app.nerdexpert.com.br).
  2. Solicitação: O Traefik detecta este novo serviço e percebe que ele precisa de um certificado SSL. Ele então inicia o processo ACME com a Let’s Encrypt, solicitando um certificado para app.nerdexpert.com.br.
  3. Desafio (Challenge): A Let’s Encrypt responde com um desafio para provar que o Traefik realmente controla o domínio. O método mais comum é o HTTP-01, onde a Let’s Encrypt pede ao Traefik para hospedar um arquivo com um conteúdo específico em um URL específico dentro do domínio.
  4. Resolução: O Traefik, sendo o proxy que controla o tráfego para o domínio, cria temporariamente o endpoint necessário para responder ao desafio da Let’s Encrypt.
  5. Validação e Emissão: A Let’s Encrypt verifica o endpoint, confirma a propriedade do domínio e emite o certificado SSL.
  6. Armazenamento e Renovação: O Traefik recebe o certificado, o armazena (geralmente em um arquivo JSON ou em um key-value store) e começa a usá-lo para servir tráfego HTTPS para sua aplicação. O Traefik também monitora a data de validade do certificado e repete esse processo automaticamente para renová-lo antes que expire.

Implementação Prática: Configurando Traefik com Docker Compose

Vamos ao que interessa: a configuração. Usaremos o Docker Compose para orquestrar nosso contêiner Traefik e, posteriormente, nossas aplicações.

Pré-requisitos Essenciais

  • Um servidor Linux (VPS ou dedicado) com um endereço IP público.
  • Docker e Docker Compose instalados.
  • Um nome de domínio (ex: nerdexpert.com.br) que você controla.
  • Registros DNS do tipo A apontando para o IP do seu servidor. Você precisará de um para o Traefik (ex: traefik.nerdexpert.com.br) e para cada aplicação que for implantar (ex: app.nerdexpert.com.br).

Passo 1: Estrutura de Diretórios e Arquivos

Vamos criar uma estrutura organizada para nossa configuração do Traefik.

mkdir traefik-proxy
cd traefik-proxy
touch docker-compose.yml
touch traefik.yml
touch acme.json
chmod 600 acme.json

Importante: O arquivo acme.json armazenará seus certificados e chaves privadas. A permissão 600 é crucial para garantir que apenas o proprietário (o usuário root dentro do contêiner Traefik) possa ler e escrever nele.

Passo 2: Configuração Estática do Traefik (traefik.yml)

Este arquivo contém as configurações de inicialização do Traefik, como os pontos de entrada (entrypoints), a conexão com a API do Docker e a configuração do resolvedor de certificados da Let’s Encrypt.

Edite o arquivo traefik.yml:

# traefik.yml

# Configurações globais
global:
  checkNewVersion: true
  sendAnonymousUsage: false

# Pontos de entrada para o tráfego
entryPoints:
  web:
    address: ":80"
    # Middleware para redirecionar todo o tráfego HTTP para HTTPS
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

# Provedores de configuração (onde o Traefik busca por serviços)
providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false # Boa prática: expor apenas contêineres com label explícito

# API e Dashboard do Traefik (inseguro por padrão, vamos proteger depois)
api:
  dashboard: true
  insecure: true # Apenas para setup inicial. NÃO USE EM PRODUÇÃO SEM AUTENTICAÇÃO.

# Resolvedor de certificados Let's Encrypt
certificatesResolvers:
  letsencrypt:
    acme:
      email: "[email protected]"
      storage: "/letsencrypt/acme.json"
      # Usando o desafio HTTP-01
      httpChallenge:
        entryPoint: web

# Log
log:
  level: INFO # Mude para DEBUG para mais detalhes durante o troubleshooting

Substitua [email protected] por um e-mail válido. A Let’s Encrypt o usará para enviar notificações sobre a expiração de certificados.

Passo 3: Orquestração do Traefik com docker-compose.yml

Agora, vamos definir o serviço Traefik em nosso arquivo docker-compose.yml.

# docker-compose.yml

version: '3.8'

services:
  traefik:
    image: "traefik:v2.11" # Use uma versão específica para evitar surpresas
    container_name: "traefik"
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      # Porta HTTP para o desafio ACME e redirecionamento
      - "80:80"
      # Porta HTTPS para o tráfego seguro
      - "443:443"
    volumes:
      # Monta o socket do Docker para que o Traefik possa detectar contêineres
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      # Monta o arquivo de configuração estática
      - "./traefik.yml:/etc/traefik/traefik.yml:ro"
      # Monta o arquivo que armazenará os certificados
      - "./acme.json:/letsencrypt/acme.json"
    networks:
      - webproxy

    labels:
      # Habilita o Traefik para gerenciar a si mesmo
      - "traefik.enable=true"
      # Roteador para o Dashboard do Traefik via HTTPS
      - "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.nerdexpert.com.br`)"
      - "traefik.http.routers.traefik-dashboard.entrypoints=websecure"
      - "traefik.http.routers.traefik-dashboard.service=api@internal"
      # Usa o resolvedor de certificados que definimos no traefik.yml
      - "traefik.http.routers.traefik-dashboard.tls.certresolver=letsencrypt"
      # Adicionaremos um middleware de autenticação aqui posteriormente

# Rede para que o Traefik possa se comunicar com outros contêineres
networks:
  webproxy:
    name: webproxy

Certifique-se de que o domínio no label Host é traefik.nerdexpert.com.br.

Passo 4: Iniciando o Traefik e Verificando a Configuração

Com os arquivos prontos, inicie o Traefik:

docker-compose up -d

Acompanhe os logs para ver a mágica acontecer:

docker-compose logs -f

Você deverá ver logs indicando que o Traefik está se comunicando com a Let’s Encrypt para obter um certificado para o seu dashboard. Após alguns segundos, acesse https://traefik.nerdexpert.com.br. Você deverá ver o dashboard do Traefik carregado com um certificado SSL válido!

Passo 5: Implantando uma Aplicação com HTTPS Automático

Agora, o teste final. Vamos implantar um serviço de exemplo, o whoami, que simplesmente exibe informações sobre a requisição HTTP.

Crie um novo diretório para sua aplicação (fora do diretório do Traefik) e crie um docker-compose.yml dentro dele:

# /home/user/minha-app/docker-compose.yml

version: '3.8'

services:
  whoami:
    image: "traefik/whoami"
    container_name: "whoami-app"
    restart: unless-stopped
    networks:
      - webproxy # Conecta à mesma rede do Traefik

    labels:
      - "traefik.enable=true"
      # Define o domínio para esta aplicação
      - "traefik.http.routers.whoami.rule=Host(`app.nerdexpert.com.br`)"
      # Direciona o tráfego para a porta 80 do contêiner
      - "traefik.http.services.whoami.loadbalancer.server.port=80"
      # Usa o ponto de entrada HTTPS
      - "traefik.http.routers.whoami.entrypoints=websecure"
      # Especifica o resolvedor de certificados
      - "traefik.http.routers.whoami.tls.certresolver=letsencrypt"

networks:
  webproxy:
    external: true # Usa a rede criada pelo docker-compose do Traefik

Substitua app.nerdexpert.com.br pelo domínio da sua aplicação (lembre-se de que o DNS já deve estar apontado).

Inicie a aplicação:

docker-compose up -d

Observe os logs do Traefik novamente. Você verá um novo processo de solicitação de certificado para app.nerdexpert.com.br. Em instantes, você poderá acessar https://app.nerdexpert.com.br e ver a página do whoami servida com um cadeado verde. Tudo isso sem tocar em um único arquivo de configuração do Traefik!

Tópicos Avançados e Boas Práticas para Produção

Ambiente de Staging vs. Produção da Let’s Encrypt

A Let’s Encrypt possui limites de taxa rígidos para evitar abusos. Ao testar suas configurações, você pode facilmente atingir esses limites. Para evitar isso, use o ambiente de “staging” da Let’s Encrypt, que não tem limites tão restritos. Para isso, adicione a linha caServer no seu traefik.yml:

certificatesResolvers:
  letsencrypt:
    acme:
      # ...
      caServer: "https://acme-staging-v02.api.letsencrypt.org/directory"
      # ...

Os certificados de staging não são confiáveis pelos navegadores (você receberá um aviso de segurança), mas são perfeitos para validar que o fluxo ACME está funcionando. Lembre-se de remover ou comentar esta linha quando for para produção.

Desafio DNS-01 para Certificados Wildcard

O desafio HTTP-01 não suporta certificados wildcard (ex: *.nerdexpert.com.br). Para isso, você precisa usar o desafio DNS-01. Neste método, em vez de hospedar um arquivo, o Traefik precisa criar um registro TXT no seu provedor de DNS via API. O Traefik suporta dezenas de provedores de DNS (Cloudflare, DigitalOcean, AWS Route 53, etc.). A configuração é mais complexa, pois exige o fornecimento de credenciais de API ao Traefik, mas oferece maior flexibilidade.

Segurança do Dashboard

Nunca exponha o dashboard do Traefik sem autenticação em produção. A forma mais simples de protegê-lo é com um middleware de autenticação básica (Basic Auth). Primeiro, gere um usuário e senha com hash:

echo $(htpasswd -nb usuario senha) | sed -e s/\\$/\\$\\$/g

Copie a saída (ex: usuario:$$apr1$$...). Agora, adicione o middleware aos labels do Traefik no docker-compose.yml:

    labels:
      # ... (outros labels)
      # Middleware de autenticação
      - "traefik.http.middlewares.auth.basicauth.users=usuario:$$apr1$$..."
      # Aplica o middleware ao roteador do dashboard
      - "traefik.http.routers.traefik-dashboard.middlewares=auth"

Reinicie o Traefik, e agora seu dashboard solicitará um nome de usuário e senha.

A automação do ciclo de vida de certificados SSL é um dos maiores ganhos de produtividade e confiabilidade que uma equipe de infraestrutura pode alcançar. A combinação de Traefik e Let’s Encrypt transforma uma tarefa manual e estressante em um processo totalmente automatizado e transparente. Ao adotar essa abordagem, você não apenas fortalece a segurança de suas aplicações com HTTPS, mas também libera sua equipe para focar em tarefas que agregam mais valor ao negócio. A configuração inicial pode exigir atenção aos detalhes, mas o retorno sobre o investimento em termos de tempo economizado e tranquilidade é imensurável, consolidando-se como uma prática indispensável para qualquer ambiente moderno baseado em contêineres em 2025.