Como HTTPS e TLS realmente funcionam: um guia prático
Você já viu o ícone de cadeado no seu navegador e sabe que HTTPS é importante. Mas você realmente entende o que acontece quando um navegador se conecta a um site HTTPS? Muitos desenvolvedores tratam o TLS como uma caixa preta—configuram uma vez e esquecem. Isso funciona até algo quebrar, o desempenho sofrer ou uma auditoria de segurança revelar configurações incorretas.
Este guia explica HTTPS e TLS em termos práticos. Você aprenderá o processo de handshake, como os certificados estabelecem confiança e os passos para implementar TLS corretamente em seus servidores. Sem excesso de jargão—apenas os conceitos necessários para depurar problemas e tomar decisões informadas.
O que HTTPS realmente é
HTTPS é o HTTP sobre TLS (Transport Layer Security). Ele fornece três garantias:
- Criptografia: Os dados trocados entre cliente e servidor são ilegíveis para bisbilhoteiros.
- Autenticação: O cliente verifica se está falando com o servidor legítimo, não com um impostor.
- Integridade: Os dados não podem ser modificados em trânsito sem detecção.
TLS é o protocolo que torna isso possível. SSL é seu predecessor—você ainda verá "certificados SSL" no marketing, mas os sistemas modernos usam TLS (atualmente TLS 1.3 é o mais recente).
O handshake TLS: passo a passo
Antes que qualquer dado HTTP flua, o cliente e o servidor realizam um handshake para concordar com os parâmetros de criptografia e verificar identidades. Aqui está o fluxo simplificado para TLS 1.3, o padrão moderno:
- Client Hello: O navegador envia uma lista de suítes de cifras suportadas, versões TLS e um valor aleatório (client random).
- Server Hello: O servidor escolhe uma suíte de cifras, envia seu próprio valor aleatório (server random) e fornece sua cadeia de certificados.
- Troca de chaves: Usando Diffie-Hellman efêmero (ou similar), ambas as partes derivam um segredo compartilhado sem transmiti-lo diretamente. Isso fornece sigilo forward secrecy—comprometer a chave privada do servidor posteriormente não descriptografará sessões passadas.
- Verificação do certificado: O cliente verifica o certificado contra CAs raiz confiáveis, valida o nome de domínio e verifica o status de expiração e revogação.
- Finished: Ambos os lados enviam um MAC (código de autenticação de mensagem) para confirmar que o handshake não foi adulterado. O tráfego HTTP criptografado começa.
O TLS 1.3 reduziu o handshake para uma viagem de ida e volta (1-RTT) e suporta retomada 0-RTT para visitantes recorrentes, melhorando a latência. O TLS 1.2 exigia duas viagens de ida e volta.
Certificados: a âncora de confiança
Um certificado TLS vincula uma chave pública a um nome de domínio e é assinado por uma Autoridade Certificadora (CA). Quando seu navegador se conecta a example.com, ele verifica se o certificado:
- É assinado por uma CA em seu repositório de confiança (ou encadeia até uma).
- Corresponde ao nome de domínio (via Subject Alternative Names).
- Está dentro do período de validade.
- Não foi revogado (via OCSP ou CRL, embora a aplicação varie).
Você pode obter certificados gratuitamente do Let's Encrypt, que emite certificados de 90 dias via protocolo ACME. Ferramentas de automação como o Certbot cuidam da renovação. Para serviços internos, você pode executar sua própria CA, mas os clientes devem confiar nela explicitamente.
Configurando TLS em seu servidor
A configuração adequada equilibra segurança, compatibilidade e desempenho. Aqui está uma lista de verificação:
- Use apenas TLS 1.2 e 1.3. Desative TLS 1.0 e 1.1—eles estão obsoletos e vulneráveis.
- Escolha suítes de cifras fortes. Prefira cifras AEAD como AES-GCM ou ChaCha20-Poly1305. Evite o modo CBC e RC4.
- Ative o sigilo forward secrecy. Use troca de chaves ECDHE.
- Ative o OCSP stapling. O servidor inclui uma resposta OCSP em cache, reduzindo a latência do lado do cliente e vazamentos de privacidade.
- Defina cabeçalhos HSTS. Force os navegadores a usar HTTPS para visitas futuras.
- Redirecione HTTP para HTTPS. Garanta que nenhum tráfego em texto simples seja servido.
Para o Nginx, uma configuração segura mínima se parece com isto:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8;
add_header Strict-Transport-Security "max-age=63072000" always;
location / {
proxy_pass http://localhost:3000;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
Teste sua configuração com ferramentas como o SSL Test do SSL Labs ou testssl.sh. Mire na nota A, mas não persiga pontuações perfeitas às custas de quebrar clientes mais antigos se você precisar suportá-los.
Armadilhas comuns e como evitá-las
- Certificados expirados: Automatize a renovação e monitore a expiração. Um único certificado expirado pode derrubar seu site.
- Conteúdo misto: Carregar recursos HTTP em uma página HTTPS gera avisos e quebra funcionalidades. Use URLs relativas ou HTTPS em todos os lugares.
- Protocolos fracos: TLS 1.0/1.1 estão obsoletos. Atualize sua configuração.
- Certificados intermediários ausentes: O servidor deve enviar a cadeia completa (exceto a raiz). Intermediários ausentes causam erros de confiança em alguns clientes.
- Redirecionamentos inadequados: Redirecione HTTP para HTTPS antes de servir qualquer conteúdo e use 301 para redirecionamentos permanentes.
FAQ
Qual é a diferença entre HTTPS e TLS?
HTTPS é HTTP sobre TLS. TLS é o protocolo criptográfico que fornece criptografia, autenticação e integridade. Você não pode ter HTTPS sem TLS.
Preciso de um certificado separado para www e não-www?
Você pode incluir ambos no campo Subject Alternative Names (SAN) de um único certificado. A maioria das CAs emite certificados cobrindo ambos por padrão ou com uma configuração simples.
Com que frequência devo renovar meus certificados TLS?
Siga o período de validade da CA—90 dias para Let's Encrypt. Automatize a renovação com um cron job ou timer systemd. Renove imediatamente se uma chave privada for comprometida.
Pronto para inspecionar seu tráfego web? Use o Analisador de Logs Nginx para analisar logs de acesso e verificar requisições HTTPS, códigos de status e possíveis problemas.