Skip to main content
RunBook Academy

Secrets, PKI & CertificatesVII · TLS for OperatorsTLS

TLS 1.2 versus TLS 1.3, and why the difference reaches your configuration

Advanced⏱ ~22 minopenssl

What you'll learn

  • Summarise the differences RFC 9846 records between TLS 1.3 and TLS 1.2
  • Explain why a TLS 1.3 cipher suite name encodes only an AEAD algorithm and a hash
  • Demonstrate that a TLS 1.2 cipher list does not select or restrict TLS 1.3 suites
  • Identify which TLS 1.2 hardening measures have no TLS 1.3 equivalent and why

Prerequisites

Verified against OpenSSL 3.5.x teaching target; 3.0+ minimum · OpenSSH 10.x teaching target; 8.2+ minimum for certificate workflows · OpenBao 2.6.x · Smallstep step-ca 0.30.x · Certbot / Pebble Certbot current release; Pebble 2.10.x ACME test server · Kubernetes (cross-course target) 1.36.x · PostgreSQL 17.x · 2026-08-26

Not yet marked complete on this device.

There is no longer a standalone TLS 1.2 document. RFC 9846, published in July 2026, obsoletes RFC 8446 and RFC 5246 together, and what remains of TLS 1.2 lives in its Appendix D. That reorganisation matters less than what the RFC records in its own list of major differences, because several of those differences quietly invalidate configuration habits that engineers still carry from a decade of TLS 1.2 practice.

The differences the RFC itself records

AreaWhat RFC 9846 says changedWhat it costs you operationally
Symmetric algorithmsThe list was “pruned of all algorithms that are considered legacy. Those that remain are all Authenticated Encryption with Associated Data (AEAD) algorithms”There is no CBC mode and no separate MAC step to get wrong
Cipher suite namingThe concept was changed “to separate the authentication and key exchange mechanisms from the record protection algorithm” and the hashYour 1.2 cipher string stops being the control you think it is
Key exchange“Static RSA and Diffie-Hellman cipher suites have been removed; all public-key based key exchange mechanisms now provide forward secrecy”Forward secrecy is no longer something you enable
Encryption scope“All handshake messages after the ServerHello are now encrypted”The certificate is no longer visible to a passive observer
State machineIt was restructured “to remove superfluous messages such as ChangeCipherSpec (except when needed for middlebox compatibility)”ChangeCipherSpec is no longer a signal of anything
ResumptionStateful and stateless resumption “have been replaced by a single new PSK exchange”One mechanism to reason about, one ticket key to rotate
Zero round trip0-RTT was added, “saving a round trip at connection setup for some application data, at the cost of certain security properties”A performance option with a replay problem attached
Signatures and curves“Elliptic curve algorithms are now in the base spec, and new signature algorithms, such as EdDSA, are included”Curve support is no longer an extension question
RemovalsRSA padding moved to RSASSA-PSS, alongside “the removal of compression, the Digital Signature Algorithm (DSA), and custom Ephemeral Diffie-Hellman (DHE) groups”Custom DH parameter files are dead configuration
Version negotiationThe old mechanism “has been deprecated in favor of a version list in an extension”The version byte in the record header is no longer the version

Read the third row again. In TLS 1.2, forward secrecy was a property you obtained by choosing ephemeral suites and excluding the static ones. In TLS 1.3 it is structural: there is no mode in which the certificate key transports key material, so there is no static option left to accidentally leave enabled.

Cipher suite names stopped meaning the same thing

A TLS 1.2 suite name is a four-part description. Take TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256: ECDHE is the key exchange, RSA is the authentication, AES-128-GCM is the record protection, and SHA256 is the hash. One string, four decisions.

A TLS 1.3 suite name is a two-part description. RFC 9846 Appendix B.4 states that a cipher suite defines the pair of AEAD algorithm and hash algorithm to be used with HKDF, following the convention TLS_AEAD_HASH. There are five defined suites: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_CCM_SHA256 and TLS_AES_128_CCM_8_SHA256. None of them names a key exchange or an authentication algorithm, because those moved to the supported_groups and signature_algorithms extensions.

flowchart TD
    A["TLS 1.2 suite name\nTLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"] --> B["key exchange ECDHE"]
    A --> C["authentication RSA"]
    A --> D["record protection AES-128-GCM"]
    A --> E["hash SHA256"]
    F["TLS 1.3 suite name\nTLS_AES_128_GCM_SHA256"] --> G["record protection AES-128-GCM"]
    F --> H["hash SHA256"]
    I["supported_groups and key_share"] --> J["key exchange decided here"]
    K["signature_algorithms"] --> L["authentication decided here"]

The diagram shows why the two families cannot be mixed. RFC 9846 is explicit that although TLS 1.3 uses the same cipher suite number space as earlier versions, its suites are defined differently and cannot be used for TLS 1.2, and TLS 1.2 suites cannot be used with TLS 1.3. Writing TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 in a document as a “TLS 1.3 cipher suite” is not loose phrasing, it is a category error.

OpenSSL makes the split visible. Ask it to resolve a strictly TLS 1.2 cipher list:

openssl ciphers -s -v 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256'
TLS_AES_256_GCM_SHA384         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(256)            Mac=AEAD
TLS_CHACHA20_POLY1305_SHA256   TLSv1.3 Kx=any      Au=any   Enc=CHACHA20/POLY1305(256) Mac=AEAD
TLS_AES_128_GCM_SHA256         TLSv1.3 Kx=any      Au=any   Enc=AESGCM(128)            Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128)            Mac=AEAD
ECDHE-RSA-AES128-GCM-SHA256    TLSv1.2 Kx=ECDH     Au=RSA   Enc=AESGCM(128)            Mac=AEAD

Two things are worth staring at. The three TLS 1.3 suites appear even though the list named neither of them, because the 1.2 cipher string does not govern them. And their Kx and Au columns both read any, which is the tool telling you that the suite name carries no key exchange and no authentication information at all. The TLS 1.2 rows still carry real values in those columns.

What was removed, and what took its place

Renegotiation is gone. RFC 9846 states plainly that renegotiation is not possible once TLS 1.3 has been negotiated, and RFC 9325 scopes its own renegotiation advice to TLS 1.2 only for that reason. The renegotiation_info extension and the Extended Main Secret extension are TLS 1.2 requirements, not TLS 1.3 hardening steps. Anyone adding them to a TLS 1.3 checklist is protecting against an attack the version does not permit.

What replaced renegotiation are two narrower mechanisms. Post-handshake authentication lets a server request a client certificate after the handshake completes, for the case where only some resources need it. Key and initialisation vector update lets either side roll the traffic keys without a new handshake, and RFC 9846 upgraded the requirement to initiate a key update before exceeding key usage limits from a recommendation to a MUST, while also limiting how many KeyUpdate messages are permitted.

TLS-level compression is gone from TLS 1.3, and RFC 9325 says implementations and deployments should not support it at all. Custom Diffie-Hellman groups are gone, which means the DH parameter file that many older deployment guides told you to generate has no role. Multi-stapling as defined in RFC 6961 is deprecated: RFC 9846 states that TLS 1.3 servers must not act on its presence.

Where TLS 1.2 still lives, and what that now means

TLS 1.2 is not forbidden, but it has stopped moving. RFC 9851, from July 2026, places TLS 1.2 in feature freeze: no changes will be approved outside urgent security fixes, new exporter labels and new ALPN protocol identifiers, and the freeze applies to TLS rather than DTLS. The practical consequence is stated even more directly in RFC 9852, which records that the working group is focusing on TLS 1.3 or later and that TLS 1.2 will not be supported.

The concrete effect is that post-quantum key exchange will never arrive for TLS 1.2. The hybrid mechanisms defined in RFC 10024, including X25519MLKEM768, are TLS 1.3 constructions. If your estate has an endpoint that can only speak TLS 1.2, you have already established the date by which it must be replaced, whether or not anyone has written that date down.

Where TLS 1.2 remains in service, the TLS 1.2 specific requirements still apply. RFC 9325 requires TLS 1.2 clients and servers to implement renegotiation_info, requires clients to send it in the ClientHello and to raise a fatal handshake failure if the server does not acknowledge it, and requires support for the extension now named Extended Main Secret. Those obligations belong to the TLS 1.2 half of your configuration and to nothing else.

Production discipline

  1. Configure the two versions as two separate controls. Prove each one by negotiating a connection that pins to that version, not by reviewing the configuration file that was supposed to set it.
  2. Delete dead TLS 1.2 furniture from TLS 1.3 deployments. Custom Diffie-Hellman parameter files, compression settings and renegotiation hardening are inert, and leaving them implies a control that does not exist.
  3. Record which endpoints are TLS 1.2 only and why. That list is your post-quantum migration backlog, because the feature freeze means those endpoints will never gain hybrid key exchange.
  4. Reject documents that write a TLS 1.2 suite name as a TLS 1.3 suite. The mistake usually travels with a compliance claim, and it means nobody tested what was actually negotiated.

Cross-course references

  • Linux for Production Sysadmins - Part LXXI (TLS) covers the service-level directives where these two controls are separately expressed, and where a dead parameter file usually survives.
  • Kubernetes for Production Sysadmins - Part LXXVI (Certs) covers the cluster PKI, whose components negotiate their own TLS and inherit the same version and suite questions.
  • Observability for Production Sysadmins - Part LXIV (TLSMonitoring) covers recording the negotiated version and suite per endpoint, which is the only evidence that a hardening change reached production.

Quiz

Knowledge check · 4 questions

  1. Q1. What does the name TLS_AES_128_GCM_SHA256 specify?

  2. Q2. Adding the renegotiation_info extension to a TLS 1.3 configuration protects the service against renegotiation attacks.

  3. Q3. Explain why forward secrecy is not a configuration option in TLS 1.3, referring to what RFC 9846 removed.

  4. Q4. Judge whether the hardening change did what the ticket claims.

    A quarterly hardening ticket for api.example.com is closed with the note that weak ciphers have been removed. The change edited one cipher list directive to leave four ECDHE AEAD suites. A reviewer notices that an external scan still reports TLS_CHACHA20_POLY1305_SHA256 as negotiable and asks whether the change was applied at all.

Passing score: 75%. Answers are checked in this browser.