Encryption & TLS

TLS 1.3 vs TLS 1.2: What Actually Changed

May 15, 2026 9 min read Haven Team

TLS 1.3 was finalized as RFC 8446 in August 2018 after roughly four years and 28 drafts. It is the largest change to the protocol since SSL 3.0 became TLS 1.0 in 1999. Most of the changes are subtractive — and that is precisely the point.


Cryptographers spent two decades watching TLS 1.0, 1.1, and 1.2 accumulate attack surface. CBC padding oracles. Compression-based attacks. Downgrade attacks. Weak key exchange. Renegotiation flaws. Each TLS 1.2 cipher suite combined four independent choices — key exchange, signature, bulk cipher, MAC — and many combinations turned out to be subtly broken even though each piece looked fine in isolation.

TLS 1.3 took the position that the only way to fix this was to delete most of it. The result is a protocol that is faster to negotiate, harder to misconfigure, and free of the cipher categories that caused most of the past decade's TLS vulnerabilities.

The Cipher Suite Diet

TLS 1.2 supports hundreds of cipher suites — somewhere around 340 are registered with IANA. TLS 1.3 supports exactly five, all of them based on AEAD constructions:

Notice what is missing: no RSA key exchange, no static Diffie-Hellman, no CBC mode, no RC4, no 3DES, no MD5, no SHA-1, no compression, no renegotiation. Everything that has been broken or that contributed to a downgrade attack since 2010 is gone from the protocol surface.

The signature algorithm and the key exchange group are now negotiated separately from the cipher suite, which simplifies the matrix and prevents incompatible combinations.

Forward Secrecy Is Mandatory

In TLS 1.2, you could disable forward secrecy by configuring an RSA key exchange cipher suite. The client would encrypt the pre-master secret to the server's long-term RSA key, and that one key compromise would later decrypt every recorded session.

TLS 1.3 removes RSA key exchange entirely. The only key exchange options are ephemeral Diffie-Hellman, either classical (FFDHE) or elliptic curve (ECDHE). Every session generates fresh ephemeral key material on both sides, and once the session ends and the ephemeral keys are destroyed, the session traffic cannot be decrypted by future compromise of any long-term key.

Operational consequence

The corporate practice of decrypting outbound TLS traffic at a network gateway using the server's private key no longer works for TLS 1.3 sessions. There is nothing for the gateway to decrypt — the session keys never appear on the wire. Companies that depended on this for DLP or intrusion detection had to switch to active man-in-the-middle inspection, which is visibly different from the client's perspective.

The Handshake Is Half as Long

TLS 1.2 requires two full round trips before the client can send application data: ClientHello → ServerHello/Certificate/KeyExchange/HelloDone → ClientKeyExchange/Finished → ServerFinished, then data.

TLS 1.3 collapses this to one round trip. The client guesses which key exchange group the server will pick and sends its DH public key in the very first ClientHello. The server responds with its own DH public key, certificate, and Finished message in the second flight. The client sends Finished plus application data immediately after. On a connection where the client guesses right — which it usually does, since X25519 is now near-universal — total handshake latency is one round trip.

For long-lived connections the speedup does not matter much. For short ones (most HTTPS requests are short), shaving an entire round trip is significant, especially on mobile networks where round-trip times can exceed 100 ms.

0-RTT and the PSK Caveat

TLS 1.3 also defines a 0-RTT (zero round trip) mode where a client that has previously connected to a server can send application data in its first flight, encrypted with a key derived from a pre-shared key (PSK) from the previous session.

The performance is excellent. The security is more nuanced. 0-RTT data does not have replay protection from the protocol itself — an attacker who captures the encrypted 0-RTT payload can replay it later, and the server has no protocol-level way to know it is a replay. Applications that use 0-RTT must implement their own replay defense or restrict 0-RTT to idempotent operations (typically GET requests).

Most major deployments enable 0-RTT only for non-state-changing requests. If you control a TLS server, this is one knob worth setting consciously rather than leaving on a default.

The ServerHello Is Encrypted

In TLS 1.2, the entire handshake is in cleartext until the ChangeCipherSpec message. A passive observer learns the server's certificate, the SNI (Server Name Indication) the client requested, and the negotiated cipher suite.

TLS 1.3 encrypts everything in the handshake after the initial key exchange — the server's certificate, the ServerHello extensions, the negotiated parameters. A passive observer of a TLS 1.3 connection still learns the client's SNI (which travels in the unencrypted ClientHello) and the destination IP, but nothing else about the negotiation.

The SNI gap is what Encrypted Client Hello (ECH) closes; ECH layers on top of TLS 1.3 to encrypt the SNI itself, but adoption is still incomplete in 2026.

The Middlebox Problem

The IETF discovered during deployment testing that a large number of corporate middleboxes — firewalls, load balancers, intrusion detection systems — were doing rough version checks on TLS handshakes and dropping anything they didn't recognize. A naive TLS 1.3 ClientHello broke a meaningful fraction of real-world connections.

The fix, baked into the deployed RFC, is a deliberate middlebox compatibility mode: TLS 1.3 ClientHellos look superficially like TLS 1.2 ClientHellos, with the actual version negotiated through an extension rather than the version field. This is a small but instructive example of protocol design having to make concessions to deployed reality.

What TLS 1.3 Does Not Change

Despite the rewrites, several long-standing TLS limitations remain:

Concern TLS 1.3 Status
SNI leaks the hostname Still leaks unless ECH is deployed end-to-end
CA trust model Unchanged — any of 100+ CAs can mint a cert for any domain
Certificate transparency Out of scope; relies on separate CT logs
Traffic analysis Packet sizes and timing still observable
Post-quantum security Hybrid post-quantum key exchange is being added; not mandatory yet

Should You Disable TLS 1.2?

Probably not yet for most public-facing services. As of 2026 a small but real fraction of legitimate clients — older Android versions, certain IoT devices, legacy clients in industrial settings — still only support TLS 1.2. Mozilla's intermediate compatibility recommendation as of this writing still includes TLS 1.2, and Google has not deprecated it.

What you can and should do is disable TLS 1.1, 1.0, and SSLv3, restrict your TLS 1.2 cipher suite list to AEAD-only options, and prefer TLS 1.3 when both sides support it. Configurations are well-documented on the Mozilla SSL Configuration Generator and apply cleanly to nginx, Apache, and most modern stacks.

The honest summary is that TLS 1.3 is a meaningful improvement and worth deploying everywhere it works. It is not a panacea — the layer above HTTPS still needs to be designed well — but the protocol itself is in the best shape it has been in since 1995.

Try Haven free for 15 days

Encrypted email and chat in one app. No credit card required.

Get Started →