Skip to content

TLS 1.3 migration and cipher selection

In-depth guide. Updated .

What changed in TLS 1.3, which protocol versions and cipher suites to allow in 2026, server configuration examples and how to test them.

What changed in TLS 1.3

TLS 1.3 (RFC 8446, 2018) is not a small revision of 1.2. It removed features that caused years of vulnerabilities: RSA key exchange without forward secrecy, static Diffie-Hellman, CBC-mode ciphers, RC4, compression and renegotiation. Every TLS 1.3 connection uses ephemeral key exchange, so a stolen server key cannot decrypt recorded past traffic.

The handshake is also faster. A new connection needs one round trip before application data flows, compared with two in TLS 1.2, and more of the handshake is encrypted, including the server certificate. An optional 0-RTT mode lets returning clients send data immediately, at the cost of allowing that early data to be replayed.

A TLS 1.3 handshakeThe client offers key shares in its first message, the server answers with its key share and encrypted certificate and Finished message, and application data starts after one round trip.ClientHelloSupported versions, cipher suites and a keyshare (for example X25519)ServerHello + key shareServer picks the suite and group; both sidesderive handshake keysEncrypted: certificate,CertificateVerify, FinishedThe certificate is no longer visible topassive observersClient FinishedHandshake complete after one round tripApplication dataProtected with AEAD (AES-GCM orChaCha20-Poly1305)
The client offers key shares in its first message, the server answers with its key share and encrypted certificate and Finished message, and application data starts after one round trip.
TLS 1.2 versus TLS 1.3
AspectTLS 1.2TLS 1.3
Forward secrecyOnly with ECDHE/DHE suitesAlways
Cipher modesCBC, GCM, ChaCha20, legacy optionsAEAD only (GCM, ChaCha20-Poly1305, CCM)
Round trips before dataTwoOne (zero with 0-RTT)
Certificate visible on the wireYesNo, encrypted
Cipher suite names include key exchangeYes, e.g. ECDHE-RSA-AES128-GCM-SHA256No, e.g. TLS_AES_128_GCM_SHA256

Which protocol versions to allow

RFC 8996 formally deprecated TLS 1.0 and 1.1 in 2021, and major browsers had already removed support. Keeping them enabled only helps very old clients while exposing everyone to downgrade-related weaknesses and failing compliance scans. For public websites, the practical baseline is TLS 1.2 and TLS 1.3.

Protocol versions in 2026
VersionStatusRecommendation
SSL 3.0Prohibited (RFC 7568)Disable
TLS 1.0Deprecated (RFC 8996)Disable
TLS 1.1Deprecated (RFC 8996)Disable
TLS 1.2Current, secure with the right suitesEnable
TLS 1.3CurrentEnable

A TLS 1.3-only configuration, what Mozilla calls the modern profile, is reasonable for APIs and internal services whose clients you control. Public sites usually keep TLS 1.2 for older operating systems, embedded devices and some corporate proxies. The TLS Checker shows which version a connection negotiated.

Choosing cipher suites

TLS 1.3

TLS 1.3 defines a small set of suites, and the ones commonly enabled are all strong. Most servers ship with sensible defaults, so there is usually nothing to configure. The suite only chooses the AEAD cipher and hash; key exchange and signature algorithms are negotiated separately.

TLS 1.3 cipher suites
SuiteNotes
TLS_AES_128_GCM_SHA256Mandatory to implement; fast with AES hardware acceleration
TLS_AES_256_GCM_SHA384Larger key; commonly enabled
TLS_CHACHA20_POLY1305_SHA256Fast on devices without AES acceleration

TLS 1.2

TLS 1.2 is where configuration matters. Allow only suites with ECDHE key exchange, for forward secrecy, and AEAD ciphers. RFC 9325 (BCP 195) gives the IETF's current recommendations and matches what maintained profiles use.

TLS 1.2 suites to allow and to remove
AllowRemove
ECDHE-ECDSA-AES128-GCM-SHA256Anything with RC4, 3DES, DES or NULL
ECDHE-RSA-AES128-GCM-SHA256Static RSA key exchange such as AES128-SHA
ECDHE-ECDSA-AES256-GCM-SHA384CBC-mode suites (...-CBC-..., ...-SHA without GCM)
ECDHE-RSA-AES256-GCM-SHA384Export and anonymous suites (EXP, aNULL)
ECDHE-ECDSA-CHACHA20-POLY1305Suites using MD5
ECDHE-RSA-CHACHA20-POLY1305

Key exchange groups and post-quantum hybrids

X25519 and P-256 are the standard key exchange groups. Browsers and large CDNs have started to use hybrid post-quantum key exchange (X25519 combined with ML-KEM) in TLS 1.3; it is negotiated automatically when both sides support it and needs no cipher suite changes.

Scanner findings explained

TLS scanners report findings by the names of old attacks, which makes them hard to prioritise. Most of them disappear together once TLS 1.0 and 1.1 are disabled and TLS 1.2 is limited to ECDHE with AEAD ciphers. The table maps common findings to the configuration change that removes them.

Common findings and fixes
FindingWhat it meansFix
TLS 1.0 / 1.1 supportedDeprecated protocol versions acceptedAllow only TLS 1.2 and 1.3
No forward secrecySuites with static RSA key exchange offeredRemove non-ECDHE suites
SWEET3264-bit block ciphers such as 3DES offeredRemove 3DES suites
ROBOTRSA key exchange with a vulnerable padding oracleRemove RSA key exchange suites; update the TLS library
Weak Diffie-Hellman (Logjam)DHE with groups smaller than 2048 bitsRemove DHE suites or use strong groups; prefer ECDHE
RC4 or CBC suitesLegacy ciphers with known weaknessesOffer AES-GCM and ChaCha20-Poly1305 only
Incomplete chainIntermediate certificate missingServe the full chain file
Certificate expires soonRenewal did not run or failedFix automation, then renew

Findings about HTTP headers, such as a missing HSTS header, often appear in the same report but are fixed in the web server's header configuration rather than the TLS settings. The HTTP Headers Checker lists those separately.

Session resumption and performance

A full handshake costs a round trip and some CPU, so clients resume earlier sessions when they can. TLS 1.3 replaced the older session ID and ticket mechanisms with pre-shared keys derived from a previous session, and it still combines resumption with a fresh key exchange by default. That keeps forward secrecy for resumed sessions too.

For TLS 1.2, session tickets encrypted with a long-lived key weaken forward secrecy, because anyone who obtains that key can decrypt the recorded sessions whose tickets it protected. Mozilla's profiles therefore disable TLS 1.2 session tickets unless the ticket keys are rotated frequently. A shared session cache on the server gives most of the performance benefit without that trade-off.

HTTP/2 and HTTP/3 reduce the number of TLS handshakes further by reusing one connection for many requests. HTTP/3 runs over QUIC, which integrates TLS 1.3 into the transport; enabling it does not change your certificate but does need UDP port 443 open.

Server configuration examples

The examples follow Mozilla's intermediate profile at the time of writing. Generate the current version for your exact server and library versions with the Mozilla SSL Configuration Generator, because recommendations change. Reload the server and scan it after every change.

nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:TLS:10m;
ssl_session_tickets off;
Apache httpd (mod_ssl)
SSLProtocol             -all +TLSv1.2 +TLSv1.3
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
SSLHonorCipherOrder     off
SSLSessionTickets       off
Caddy (defaults are already TLS 1.2+ with modern suites)
example.com {
    tls {
        protocols tls1.2 tls1.3
    }
}

ssl_prefer_server_ciphers off lets clients choose among the allowed suites, which is the current recommendation because every allowed suite is strong and clients know whether they have AES hardware acceleration. The TLS 1.3 suites are configured separately in OpenSSL-based servers and rarely need changing.

Behind a CDN or load balancer, the edge terminates TLS for visitors, so its TLS policy is what the TLS Checker and browsers see. Configure the minimum version there, and use TLS between the edge and your origin as well.

Certificates and key types

Keep private keys on the servers or edge platforms that terminate TLS, readable only by the service account that needs them. Rotate the key when a certificate is reissued after any suspected exposure, not just the certificate.

The certificate's key type determines which suites can be used. ECDSA P-256 certificates are smaller and faster to verify than RSA; RSA 2048 remains universally supported. Many servers can serve both at once and pick one per client, although with current clients a single ECDSA or RSA certificate is fine.

  • Serve the full chain: the leaf certificate plus intermediates, not the root.
  • Automate renewal; publicly trusted certificate lifetimes keep getting shorter under CA/Browser Forum rules.
  • Monitor expiry independently of the renewal job, for example with the TLS Checker in a scheduled check or the XGM API.
  • Add HTTP Strict Transport Security once HTTPS works everywhere; the HSTS guide explains the rollout.

Testing your configuration

Test from outside your network, because proxies and CDNs change what visitors see. Check that TLS 1.3 and 1.2 connect, that 1.0 and 1.1 are refused, and which suites the server offers. The commands below use OpenSSL and nmap, both widely available.

Command-line checks
# TLS 1.3 should connect
openssl s_client -connect example.com:443 -servername example.com -tls1_3 </dev/null 2>/dev/null | grep -E 'Protocol|Cipher'

# TLS 1.1 should fail (depending on your OpenSSL build, the client may refuse locally)
openssl s_client -connect example.com:443 -servername example.com -tls1_1 </dev/null

# list offered protocol versions and suites
nmap --script ssl-enum-ciphers -p 443 example.com
What a good result looks like
CheckExpected
TLS 1.3 connectionProtocol: TLSv1.3 with an AES-GCM or ChaCha20 suite
TLS 1.2 connectionOnly ECDHE suites with GCM or ChaCha20
TLS 1.0 / 1.1Handshake failure
CertificateValid, full chain, matches the host name, not close to expiry
Grade in nmap outputNo suites marked weak

Automate the scan. Running the same checks weekly, or after every infrastructure change, catches regressions such as a new load balancer with default settings or a certificate that was renewed with an incomplete chain. Store the results so you can see when a change happened, not just that the current state is wrong.

When a check fails only from some locations, suspect a CDN or anycast setup where different edge locations run different configurations, or a DNS change that has not reached every resolver yet. Testing the IP addresses behind the host name one by one, with --resolve in curl or -connect to a specific IP in OpenSSL, narrows it down quickly.

Remember other TLS endpoints: mail servers on ports 25, 465 and 587, IMAP on 993, and admin panels on non-standard ports. They often run different software with older defaults. The Port Scanner shows which ports are reachable from the internet.

Compatibility and rollout

Disabling TLS 1.0 and 1.1 affects only clients that cannot do TLS 1.2, which today means very old operating systems, outdated embedded devices and some legacy integrations. If you have server logs with protocol versions, check how many requests still use the old versions before switching them off. Many teams find the number is effectively zero apart from scanners.

  1. Log the negotiated protocol and cipher for a week, if your server supports it.
  2. Identify remaining old clients; contact the owners of important integrations.
  3. Disable TLS 1.0 and 1.1 and weak TLS 1.2 suites in one change, and scan.
  4. Watch error rates and support requests for a few days.
  5. Revisit the configuration yearly against the current Mozilla profile.

FAQ

Is TLS 1.2 still secure?

Yes, with forward-secret ECDHE suites and AEAD ciphers. The problems of TLS 1.2 come from legacy suites and features that you can disable.

Should I disable TLS 1.2 and use only 1.3?

For APIs and services with modern clients, it is a reasonable choice. Public websites usually keep TLS 1.2 for older devices and corporate proxies.

Do I need to configure TLS 1.3 cipher suites?

Rarely. The default TLS 1.3 suites in current OpenSSL, BoringSSL and other libraries are all strong.

What is 0-RTT and should I enable it?

0-RTT lets returning clients send data in their first message, saving a round trip. That early data can be replayed, so enable it only for requests that are safe to repeat, or leave it off.

Why does a scanner say my server supports weak ciphers when my config does not?

The scanner may be reaching a different endpoint, such as a CDN, load balancer or an old virtual host that is served as the default. Check which server actually terminates TLS for that host name.

Is ECDSA or RSA better for the certificate?

ECDSA P-256 keys are smaller and handshakes are faster, and all current browsers support them. RSA 2048 has the widest compatibility with very old clients. Either is fine for most sites.

Do internal services need the same TLS settings?

Yes, and they often lag behind. Internal APIs, databases and admin tools usually have clients you control, which makes a TLS 1.3-only configuration easier there than on public websites.

What about TLS on mail servers?

SMTP between servers uses STARTTLS and, for compatibility, often allows a wider range of versions than websites. Disable SSL 3.0, TLS 1.0 and 1.1 there too where your mail software allows it, and see the MTA-STS guide for enforcing TLS on delivery.

Does TLS version matter for SEO?

Search engines expect HTTPS, but they do not rank by TLS version. The reasons to modernise are security, compliance and speed.

Sources