Trilha 13 · Segurança e criptografia

TLS e HTTPS

Esta lição não traz nenhuma ideia nova: o TLS é a montagem de tudo o que veio antes. Diffie-Hellman para combinar a chave, certificados para saber com quem se fala, assinatura para provar posse da chave privada, hash para integridade e cifra simétrica autenticada para os dados. Ver como as peças se encaixam — e por que cada uma precisa estar ali — é o melhor jeito de fixar a trilha inteira.

① Intuição

Uma negociação antes da conversa

Antes de a primeira letra do seu GET /minha-conta existir, navegador e servidor já trocaram meia dúzia de mensagens. Nelas eles combinam qual versão do protocolo e qual cifra usar, derivam uma chave secreta que ninguém escutando consegue calcular, e o servidor prova ser quem diz ser. Só quando tudo isso termina o HTTP entra em cena — trafegando dentro de um túnel já pronto.

A parte elegante é que o TLS não conhece HTTP. Ele é uma camada genérica entre TCP e o aplicativo: os mesmos passos protegem e-mail (SMTP, IMAP), bancos de dados, MQTT em dispositivos IoT e VPNs. HTTPS é apenas "HTTP dentro de TLS" — o S não muda nada no HTTP em si.

Três garantias, nem uma a mais. Confidencialidade: ninguém lê o conteúdo. Integridade: ninguém altera sem ser detectado. Autenticidade: você está falando com o dono daquele domínio. O que o TLS não promete: que o site seja honesto, que o servidor seja seguro, que o dono do site não venda seus dados, ou que ninguém saiba que você acessou aquele domínio.
② Visualização interativa

O handshake, mensagem por mensagem

Avance pelos sete passos e acompanhe o momento exato em que a chave de sessão passa a existir e o tráfego deixa de ser legível. Marque a caixa "ver como quem está escutando a rede" para comparar o que você vê com o que a espiã obtém.

O HTTPS não inventa nada: ele junta tudo das lições anteriores. Diffie-Hellman para combinar a chave, certificados para saber com quem se fala, assinatura para provar posse da chave privada, e cifra simétrica autenticada para os dados. Avance passo a passo por um handshake TLS 1.3.

💻
Navegador
ClientHello⚠ em texto claro
versões TLS suportadas: 1.3, 1.2
cifras suportadas: AES-128-GCM, ChaCha20-Poly1305
key_share: chave pública efêmera do cliente
server_name (SNI): exemplo.com.br
random: 32 bytes aleatórios
🖥️
Servidor
🔑 chave ainda não derivada
O cliente já manda sua metade do Diffie-Hellman na PRIMEIRA mensagem. É essa antecipação que faz o TLS 1.3 completar o handshake em uma ida e volta, contra duas no TLS 1.2.
③ Explicação técnica

O handshake TLS 1.3

# O handshake TLS 1.3 completo — uma ida e volta.

# → ClientHello                              (em texto claro)
#     versões suportadas: 1.3
#     cifras: AES-128-GCM, ChaCha20-Poly1305
#     key_share: chave pública EFÊMERA do cliente  ← já na 1ª msg
#     server_name: exemplo.com.br                  ← ⚠ visível!

# ← ServerHello                              (em texto claro)
#     cifra escolhida, key_share do servidor
#
#  ⚡ neste ponto os dois lados derivam a MESMA chave de sessão,
#     por Diffie-Hellman. Tudo daqui em diante vai cifrado.

# ← Certificate                              🔒 já cifrado
#     o certificado do site + a CA intermediária
# ← CertificateVerify                        🔒
#     assinatura de TODO o handshake, com a chave privada do site
#     ← este é o passo que mata o man-in-the-middle
# ← Finished                                 🔒
#     MAC de todo o handshake (detecta downgrade)

# → Finished                                 🔒
# → GET /minha-conta                         🔒 só agora o HTTP

# TLS 1.2 precisava de DUAS idas e voltas; o 1.3 faz em UMA,
# porque o cliente já chuta a chave efêmera na primeira mensagem.
# Numa conexão intercontinental (~150 ms de RTT), isso é a
# diferença entre 300 ms e 150 ms antes do primeiro byte útil.

Por que cada peça está ali

# Por que cada peça está ali — e o que quebra sem ela.
#
# DIFFIE-HELLMAN EFÊMERO  → confidencialidade + sigilo futuro
#   sem ele: a chave da sessão viria cifrada com a chave do
#   certificado, e quem gravasse o tráfego hoje poderia decifrar
#   tudo no dia em que essa chave vazasse.
#
# CERTIFICADO             → identidade
#   sem ele: você teria um canal perfeitamente cifrado... com o
#   atacante.
#
# CertificateVerify       → prova de POSSE da chave privada
#   sem ele: o certificado é público, qualquer um copia. Assinar
#   dados que só existem NESTA conexão é o que prova que o
#   servidor é mesmo o dono.
#
# Finished (MAC)          → integridade do próprio handshake
#   sem ele: um atacante alteraria o ClientHello para remover as
#   cifras fortes e forçar uma fraca — o ataque de DOWNGRADE.
#
# AES-GCM                 → confidencialidade + integridade dos dados

# SIGILO FUTURO (forward secrecy), explicado:
#   As chaves DH desta conexão são efêmeras — geradas agora,
#   descartadas ao final, nunca gravadas em disco.
#   A chave privada do certificado serve apenas para ASSINAR.
#   Se ela vazar amanhã, o tráfego gravado hoje continua ilegível.
#   O TLS 1.3 removeu de vez os modos sem essa propriedade.
O 0-RTT e seu preço. O TLS 1.3 permite retomar uma sessão anterior enviando dados já na primeira mensagem — latência zero antes do primeiro byte. O problema é que esses dados não têm como ser protegidos contra repetição: um atacante que capture o pacote pode reenviá-lo depois, e o servidor o processará de novo. Por isso o 0-RTT só deve carregar requisições idempotentes — um GET, nunca um POST /transferir. É um caso didático de troca explícita entre desempenho e segurança.

O que o HTTPS não esconde

# O que o HTTPS NÃO esconde de quem observa a rede:
#
#  ✗ o endereço IP do servidor
#  ✗ o nome do domínio — vai em claro no SNI do ClientHello e
#    também na consulta DNS anterior
#  ✗ o TAMANHO e o RITMO dos pacotes (análise de tráfego consegue
#    inferir muita coisa: qual vídeo você está assistindo, qual
#    página de um site você abriu)
#  ✗ o horário e a duração da conexão
#
#  ✓ escondidos: a URL completa, cabeçalhos, cookies, corpo,
#    resposta — tudo que vem depois do handshake

# É por isso que provedores e firewalls corporativos conseguem
# bloquear sites específicos mesmo sob HTTPS: basta olhar o SNI.
# As respostas em andamento: ECH (Encrypted Client Hello), que
# cifra o SNI, e DNS sobre HTTPS/TLS, que fecha o vazamento do DNS.

# HSTS — fechando a janela do primeiro acesso
#   Ao digitar "banco.com", o navegador tenta HTTP antes do
#   redirecionamento. Um atacante na rede pode sequestrar esse
#   primeiro pedido (ataque SSL stripping).
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
#   Com isso o navegador PROMETE nunca mais usar HTTP nesse
#   domínio. Com "preload", a promessa já vem embutida no
#   navegador — antes mesmo do primeiro acesso.

Configuração na prática

# Configurar TLS na prática: o que importa

#  1. TLS 1.2 e 1.3 apenas. Desligue SSLv3, TLS 1.0 e 1.1.
#  2. Só cifras com sigilo futuro e AEAD (ECDHE + AES-GCM/ChaCha20).
#  3. HSTS ligado, com preload.
#  4. Certificados renovados automaticamente (ACME/certbot) —
#     a causa nº 1 de queda por TLS é certificado vencido.
#  5. Cadeia completa servida (site + intermediárias). Esquecer a
#     intermediária funciona no seu navegador, que a tem em cache,
#     e falha no celular de outra pessoa — um bug clássico.

# Ferramentas para conferir em vez de supor:
#   ssllabs.com/ssltest        — nota A+ a F, com o porquê
#   testssl.sh                 — o mesmo, localmente
openssl s_client -connect exemplo.com.br:443 -tls1_3

# mTLS (TLS mútuo): o CLIENTE também apresenta certificado.
# Usado entre microsserviços e em redes zero-trust — a identidade
# do serviço deixa de ser "está dentro da VPN" e passa a ser
# criptográfica. É o que malhas de serviço como o Istio automatizam.
④ Projeto para programar

Experimentando

Mini projeto: capture um handshake real com o Wireshark. Filtre por tls, acesse um site e identifique cada mensagem da visualização acima nos pacotes de verdade. Repare no que você consegue ler — o SNI, em texto claro, dizendo qual site você acessou — e no ponto exato em que tudo vira Application Data ilegível. Depois compare uma conexão TLS 1.2 com uma 1.3 e conte as idas e voltas.

Projeto principal: suba um servidor HTTPS local com um certificado que você mesmo emitiu (aproveite a mini-PKI da lição anterior) e escreva um cliente em Python que se conecte a ele. Depois provoque cada falha propositalmente: certificado expirado, nome de domínio errado, CA não instalada. Observe as exceções exatas que a biblioteca levanta. Por fim, desligue a verificação com verify=False e reflita sobre o que você acabou de desativar — é a linha que aparece em incontáveis tutoriais e transforma HTTPS em teatro.

Desafio extra: monte um proxy TLS interceptador na sua própria máquina, com mitmproxy. Instale a raiz dele no seu navegador e observe todo o seu tráfego HTTPS em texto claro. Depois tente interceptar um app de celular que use certificate pinning e veja a conexão falhar — o app exige uma chave específica e ignora a loja de raízes do sistema. Esse exercício ensina de uma vez o poder de quem controla a loja de certificados e o motivo de o pinning existir.

⑤ Exercícios rápidos

Teste sua intuição

O que o HTTPS garante?
O que é sigilo futuro (forward secrecy)?
O que alguém escutando sua rede consegue ver numa conexão HTTPS?
Para que serve a mensagem CertificateVerify?
⑥ Aplicações no mundo real

Onde você encontra isso

🩸

Heartbleed

Em 2014, um bug de leitura fora dos limites no OpenSSL permitia pedir "me devolva 64 KB de memória" a qualquer servidor vulnerável — e receber chaves privadas, senhas e cookies de sessão. Cerca de 17% dos servidores HTTPS do mundo foram afetados. A lição não foi sobre criptografia: o algoritmo estava perfeito. Foi sobre a implementação, e sobre o quanto da infraestrutura mundial dependia de um projeto mantido por pouquíssimas pessoas sem financiamento.

🏢

Inspeção TLS corporativa

Muitas empresas instalam uma CA raiz própria nas máquinas dos funcionários e passam todo o tráfego por um proxy que decifra, inspeciona e recifra. Tecnicamente é um man-in-the-middle consentido — e funciona exatamente porque a confiança em certificados é delegada. É também o motivo pelo qual apps sensíveis usam certificate pinning, exigindo uma chave específica em vez de aceitar qualquer raiz instalada.

🧅

Quando o HTTPS não basta

O HTTPS esconde o conteúdo, mas não com quem você fala. Onde isso é o que importa — jornalismo sob regimes autoritários, denúncias, ativismo — entram VPNs (que transferem a confiança para o provedor da VPN) e o Tor, que encaminha o tráfego por três nós com camadas de cifra, de modo que nenhum deles conhece origem e destino ao mesmo tempo. É a diferença entre proteger o conteúdo e proteger os metadados.

← Anterior: Assinaturas e certificados Próxima: Autenticação na web →