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 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.