TLS 1.3 Handshakes and the Limits of 0-RTT
Distinguish the usual 1-RTT certificate-based full handshake from optional 0-RTT resumption. See how PSK modes affect forward secrecy, why early data can be replayed, and what to verify before deployment.
Publication & corrections: infostoa · Editorial standards
Individual author and specialist reviewer information is not provided for this article.
Historical Limitations of TLS 1.2 and the Evolution Toward RFC 8446
Transport Layer Security (TLS) represents the cryptographic backbone safeguarding modern internet communications. For over a decade, TLS 1.2 served as the global standard for securing enterprise web applications, APIs, and client-server architectures. However, architectural paradigms embedded within TLS 1.2 exhibited structural inefficiencies and accumulating cryptographic liabilities. Foremost among these was handshake latency: TLS 1.2 handshake round trips varied with the negotiated full or resumed handshake path. Across transcontinental networks or mobile cellular connections plagued by high base latency, this preliminary negotiation created substantial application responsiveness bottlenecks.
Concurrently, decades of accumulated backwards compatibility forced TLS 1.2 implementations to retain archaic, vulnerable cryptographic algorithms. These included static RSA key exchange algorithms, legacy cipher block chaining (CBC) modes vulnerable to padding oracle exploits, and outdated hashing functions such as MD5 and SHA-1. In particular, static RSA key exchange lacked Perfect Forward Secrecy (PFS); if an adversary compromised the long-term private key of a server at any point in the future, all previously recorded historical network traffic could be retroactively decrypted in bulk. Recognizing the necessity of a modernized cryptographic transport protocol, the Internet Engineering Task Force (IETF) ratified RFC 8446 in August 2018, establishing TLS 1.3 as a clean-slate overhaul of secure network transport.
1-RTT/0-RTT Protocol Paths and Forward-Secrecy Limits
A certificate-based TLS 1.3 full handshake normally takes one round trip (1-RTT): the client includes a key-share offer in ClientHello and the server replies with its selected share in ServerHello. If the server sends HelloRetryRequest because it cannot accept the offered group, another round trip is needed. Thus 1-RTT describes the usual path, not a guarantee for every connection. Resumption can also use PSK-based 1-RTT; optional 0-RTT lets a client send early data in its first flight. RFC 8446 §§2.3, 4.1.4
What 0-RTT can save is the wait for a handshake round trip before sending eligible early data. It does not remove network propagation delay or make the full handshake finish instantly, and a server can reject early data and continue with 1-RTT. The observed benefit depends on successful resumption, server acceptance, the network path, and application processing. RFC 8446 §2.3
TLS 1.3 removed static RSA key exchange, but that does not mean every connection has identical forward secrecy. Certificate-based (EC)DHE and PSK+(EC)DHE use fresh key shares. PSK-only (psk_ke) has no fresh (EC)DHE exchange, and the RFC explicitly says 0-RTT early data lacks full forward secrecy. Check the negotiated mode and data type instead of treating forward secrecy as an unconditional property of TLS 1.3. RFC 8446 §§4.2.9, E.1.3
Enterprise Deployment and Infrastructure Configuration
Deploying TLS 1.3 across production infrastructure requires targeted updates within edge reverse proxies (such as Nginx, HAProxy, Envoy) and Content Delivery Networks (Cloudflare, AWS CloudFront, Fastly). Within an Nginx configuration, for instance, infrastructure teams specify TLSv1.3 within the ssl_protocols parameter and mandate modern Authenticated Encryption with Associated Data (AEAD) ciphers—specifically TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, or TLS_CHACHA20_POLY1305_SHA256.
Enabling TLS 1.3 does not guarantee a fixed reduction in round-trip time or an improvement in Core Web Vitals. On a resumed connection where the server accepts 0-RTT, eligible request data can be sent before the handshake completes; the effect depends on resumption and acceptance rates, path latency, and application work. Compare the same routes and user cohort before and after rollout, and observe handshake/resumption behavior separately from real-user performance metrics.
0-RTT security boundaries and endpoint decisions
A certificate-based TLS 1.3 full handshake is normally 1-RTT, but a HelloRetryRequest can add a round trip. TLS 1.2 RTT also varies with the handshake and resumption path, so do not assign one count to a protocol version. TLS 1.3 PSK resumption can use 1-RTT; 0-RTT is an option to send early data in the first flight.
PSK-only key establishment (psk_ke) has no fresh (EC)DHE exchange, while psk_dhe_ke combines PSK and (EC)DHE. TLS 1.3 sessions therefore do not all have identical forward-secrecy properties. RFC 8446 explicitly says 0-RTT data has no forward secrecy and no guarantee against replay across connections.
Early data is not processed twice within one connection, but it may be replayed over separate connections. The server mitigations in RFC §8 have deployment and shared-state constraints; TLS-layer defenses do not guarantee complete duplicate prevention for the application. Do not decide from an HTTP method name alone. For example, GET /account/charge is unsuitable if it triggers a payment. Only consider endpoints with no external side effects and acceptable duplicate outcomes; keep payments, booking creation, and state changes after the handshake. Application idempotency can complement this by recording a request identifier atomically with the state change.
Before enabling early data, check (1) which TLS termination point accepts it, (2) actual effects on candidate routes, (3) ticket/replay state across servers and regions, and (4) 1-RTT fallback when early data is rejected. This is a review example, not a server or CDN test. See RFC 8446 §§2.2–2.3, 4.2.9, and 8.