The TLS Handshake#
Every HTTPS connection starts with a TLS handshake that establishes encryption parameters and verifies the server’s identity. The simplified flow for TLS 1.2:
Client Server
|── ClientHello ──────────────────>| (supported versions, cipher suites, random)
|<────────────────── ServerHello ──| (chosen version, cipher suite, random)
|<──────────────── Certificate ──| (server's certificate chain)
|<───────────── ServerKeyExchange ─| (key exchange parameters)
|<───────────── ServerHelloDone ──|
|── ClientKeyExchange ───────────>| (client's key exchange contribution)
|── ChangeCipherSpec ────────────>| (switching to encrypted communication)
|── Finished ────────────────────>| (encrypted verification)
|<──────────── ChangeCipherSpec ──|
|<──────────────────── Finished ──|
|<═══════ Encrypted traffic ═════>|
TLS 1.3 simplifies this significantly. The client sends its key share in the ClientHello, allowing the handshake to complete in a single round trip. TLS 1.3 also removed insecure cipher suites and compression, eliminating entire classes of vulnerabilities (BEAST, CRIME, POODLE).