Saltar para o conteúdo
HTTPS, TLS e Certificados: O que Todo Dev Precisa Saber
Segurança

HTTPS, TLS e Certificados: O que Todo Dev Precisa Saber

25 de maio de 2026·Paulo Pereira

TLS em 3 Minutos

TLS (Transport Layer Security) é o protocolo que protege a comunicação entre cliente e servidor. Quando você vê o cadeado no navegador, TLS está trabalhando:

  1. Handshake: cliente e servidor negociam versão do TLS e cipher suite
  2. Autenticação: servidor apresenta seu certificado (assinado por uma CA confiável)
  3. Troca de chaves: estabelece uma chave de sessão efêmera
  4. Comunicação: tudo criptografado e autenticado com a chave de sessão

Certificados: Entendendo a Chain of Trust

Root CA (Mozilla/Google/Microsoft confiam)
  └── Intermediate CA (Let's Encrypt R3)
        └── Seu certificado (exemplo.com)

O navegador confia na Root CA, que assinou o Intermediate CA, que assinou seu certificado. Essa cadeia deve estar completa na configuração do seu servidor.

Let’s Encrypt com Certbot

# Ubuntu/Debian com Nginx
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d exemplo.com -d www.exemplo.com

# Renovação automática (já configurada pelo certbot)
sudo certbot renew --dry-run

# Verificar quando expira
openssl s_client -connect exemplo.com:443 -servername exemplo.com 2>/dev/null \
  | openssl x509 -noout -dates

Configuração Nginx Segura

server {
    listen 443 ssl http2;
    server_name exemplo.com;

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

    # Apenas TLS 1.2 e 1.3 (1.0 e 1.1 são inseguros)
    ssl_protocols TLSv1.2 TLSv1.3;

    # Cipher suites modernos e seguros
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;

    # HSTS: força HTTPS por 1 ano
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    # OCSP Stapling — verifica revogação do certificado
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/exemplo.com/chain.pem;

    # Session cache para melhorar performance
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
}

# Redireciona HTTP para HTTPS
server {
    listen 80;
    server_name exemplo.com www.exemplo.com;
    return 301 https://$server_name$request_uri;
}

Security Headers Essenciais

# Além do HSTS, adicione:
add_header X-Content-Type-Options    "nosniff"        always;
add_header X-Frame-Options           "DENY"           always;
add_header X-XSS-Protection         "1; mode=block"  always;
add_header Referrer-Policy           "strict-origin-when-cross-origin" always;
add_header Permissions-Policy        "camera=(), microphone=(), geolocation=()" always;

# CSP — Content Security Policy (ajuste para sua aplicação)
add_header Content-Security-Policy
  "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; font-src 'self';"
  always;

Certificados em Ambientes Docker/K8s

# docker-compose com cert-manager (K8s) ou volumes de certificado

# Para desenvolvimento local com mkcert:
# brew install mkcert && mkcert -install
# mkcert localhost 127.0.0.1

version: '3.8'
services:
  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./certs:/etc/ssl/certs:ro
    ports:
      - "443:443"
      - "80:80"

Testando sua Configuração

# SSL Labs — nota A a F para sua configuração
# https://www.ssllabs.com/ssltest/

# testssl.sh — teste local
docker run --rm -ti drwetter/testssl.sh exemplo.com

# Verificar cipher suites disponíveis
nmap --script ssl-enum-ciphers -p 443 exemplo.com

# Verificar se TLS 1.0/1.1 está desabilitado
openssl s_client -connect exemplo.com:443 -tls1
# Deve retornar erro se corretamente configurado

Certificate Transparency (CT)

Todos os certificados emitidos são registrados publicamente em logs de CT. Você pode monitorar emissões para seu domínio:

# Verifique certificados emitidos para seu domínio
curl "https://crt.sh/?q=%.exemplo.com&output=json" | jq '.[].name_value'

Configure alertas no crt.sh para ser notificado sobre novos certificados — útil para detectar certificados fraudulentos.

Conclusão

HTTPS hoje é requisito mínimo. Com Let’s Encrypt gratuito e ferramentas como Certbot, não há desculpa para servir HTTP puro. Configure HSTS, desative TLS < 1.2, e valide regularmente com SSL Labs.