Iniciante Criptografia

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ãoStatusRecomendação
SSL 2.0QuebradoDesabilite
SSL 3.0QuebradoDesabilite
TLS 1.0ObsoletoDesabilite
TLS 1.1ObsoletoDesabilite
TLS 1.2AceitávelMantenha com cuidado
TLS 1.3Atual, seguroUse

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:

  1. Assinatura de uma CA confiável.
  2. Data de validade.
  3. Nome do domínio (CN ou SAN).

Se qualquer verificação falhar, o browser exibe aviso de conexão insegura.