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:
- Handshake: cliente e servidor negociam versão do TLS e cipher suite
- Autenticação: servidor apresenta seu certificado (assinado por uma CA confiável)
- Troca de chaves: estabelece uma chave de sessão efêmera
- 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 -datesConfiguraçã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 configuradoCertificate 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.