O cadeado do navegador é um handshake. Antes de mandar um byte de dado, cliente e servidor negociam uma cifra, provam identidade com certificado e combinam uma chave secreta. Roda o handshake aqui embaixo e veja a troca acontecer passo a passo.
O visualizador é interativo e fica muito melhor numa tela grande. Abra no desktop pra rodar e ver o custo acontecer. A teoria, o código em Go e o Desafio seguem aqui embaixo, dá pra ler tranquilo no celular.
🧑💻 CLIENTESERVIDOR 🖥
—Round trips
—Canal
TLS 1.3Versão
Root CA (já confiável no seu device)
DigiCert Global Root G2
↓ assina
Intermediário
DigiCert TLS RSA SHA256 2020 CA1
↓ assina
Folha (apresentado pelo servidor)
CN = exemplo.com ✓ válido
Escolhe a versão e clica em iniciar. Depois testa o "Tentar MITM" e veja a validação do certificado barrar o impostor.
O TLS resolve dois problemas de uma vez: identidade (você fala mesmo com exemplo.com?) e sigilo (ninguém no meio lê os dados). A sacada é misturar dois tipos de cripto.
Cripto
Pra quê
Custo
Assimétrica
trocar a chave de sessão com segurança
lenta
Simétrica
cifrar os dados de fato
rápida
A cadeia de certificados (folha → intermediário → root CA) é o que prova a identidade: alguém em quem seu device já confia avaliza que aquela chave pública é mesmo do domínio.
Servidor HTTPS em Go
// O handshake TLS é transparente pro seu código:
srv := &http.Server{Addr: ":443"}
log.Fatal(srv.ListenAndServeTLS("cert.pem", "key.pem"))
Cliente: validação é o default
resp, err := http.Get("https://exemplo.com")
// O footgun clássico: desligar a validação.// InsecureSkipVerify abre a porta pra MITM.
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // NUNCA em prod
}
🧠 Desafio — TLS & o Handshake
Roda o handshake e a tentativa de MITM aqui de cima antes de responder. As duas últimas são de reflexão: escreve a sua e só então revela o modelo.
🔧 Prática — ache o bug
Esse cliente HTTPS tem um furo de segurança clássico. Clica na linha do bug.