TLS/SSL: handshake, certificado e ataques
TLS (Transport Layer Security) é o protocolo que protege a comunicação entre cliente e servidor na internet. SSL é o predecessor obsoleto — hoje só se fala em TLS, mas o nome “SSL” ainda é usado informalmente.
Versões e o que usar
| Versão | Status | Recomendação |
|---|---|---|
| SSL 2.0 | Quebrado | Desabilite |
| SSL 3.0 | Quebrado | Desabilite |
| TLS 1.0 | Obsoleto | Desabilite |
| TLS 1.1 | Obsoleto | Desabilite |
| TLS 1.2 | Aceitável | Mantenha com cuidado |
| TLS 1.3 | Atual, seguro | Use |
O handshake TLS 1.3
Cliente Servidor
| |
|-- ClientHello (versão, ciphers) -->
|<-- ServerHello + Certificado ---
|<-- (chave efêmera ECDH) --------
|-- (valida certificado) -------->
|-- Finished (chave derivada) --->
|<-- Finished --------------------
|=== Comunicação cifrada com AES-GCM ===
O TLS 1.3 usa ECDHE (Elliptic Curve Diffie-Hellman Ephemeral) para troca de chaves, garantindo Perfect Forward Secrecy — mesmo que a chave privada do servidor vaze no futuro, sessões passadas permanecem seguras.
Verificando TLS de um servidor
# Ver versão e cipher suite em uso
openssl s_client -connect example.com:443 -tls1_3
# Listar suporte a versões antigas
nmap --script ssl-enum-ciphers -p 443 example.com
Ataques conhecidos
BEAST (Browser Exploit Against SSL/TLS)
Afeta TLS 1.0 com modo CBC. O atacante explora a previsibilidade do IV para decifrar bytes da mensagem.
Mitigação: desabilite TLS 1.0. Use TLS 1.2+ com AES-GCM.
POODLE (Padding Oracle On Downgraded Legacy Encryption)
Afeta SSL 3.0. Explora o esquema de padding para decifrar tráfego cifrado.
Mitigação: desabilite SSL 3.0 completamente. No Nginx:
ssl_protocols TLSv1.2 TLSv1.3;
Downgrade Attack
O atacante força cliente e servidor a negociarem uma versão mais fraca de TLS, onde vulnerabilidades existem.
Mitigação: use o header Strict-Transport-Security (HSTS) e force versão mínima no servidor.
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
Certificado no handshake
O servidor apresenta seu certificado X.509. O cliente verifica:
- Assinatura de uma CA confiável.
- Data de validade.
- Nome do domínio (CN ou SAN).
Se qualquer verificação falhar, o browser exibe aviso de conexão insegura.