TLS versions: which to accept and how to turn off old ones

Which TLS versions a server should accept, why TLS 1.0 and 1.1 matter mainly for standards, and how to turn them off.

TLS is the protocol that encrypts HTTPS. Four versions are still found on servers: TLS 1.0 from 1999, 1.1 from 2006, 1.2 from 2008, and 1.3 from 2018. A browser and a server use the newest version they both support.

Current browsers no longer offer TLS 1.0 or 1.1. A server that accepts TLS 1.2 and 1.3 works for every visitor; whether it also accepts the older ones mostly matters for old software and for compliance.

What SignalDNS checks

Alongside the certificate check, we try each of TLS 1.0, 1.1, 1.2, and 1.3 on its own, to the same address, with 4 seconds for each. We stop after the handshake. Each version gets one of three results:

  • Accepted: the handshake completed.
  • Refused: the server answered with a TLS alert, or closed the connection during the handshake.
  • Not tried: a timeout or another error, which says nothing either way.

Our TLS library won’t offer TLS 1.0 or 1.1 at its default security level, so we lower it for those two attempts only. The certificate itself is always checked over TLS 1.2 or later.

The “Is the connection secure?” answer lists the versions the server accepts. The certificate inspector shows them too, and includes them in its list download.

It accepts TLS 1.0 or 1.1

The server still completes a handshake with TLS 1.0 or 1.1. We report this as a fact, not a problem, and it doesn’t change the answer’s level.

Browsers stopped using them in 2020: Firefox 78 turned them off, Chrome 84 removed them, and Apple set March 2020 for their removal from Safari. Because browsers don’t offer them at all, a browser’s connection can’t be pushed down to them, and TLS 1.3 has its own protection against downgrades. So leaving them on doesn’t change how browsers connect.

It still matters in two cases:

  • Standards and audits. The IETF deprecated both versions in 2021 (RFC 8996), which says TLS 1.0 and 1.1 must not be used. PCI DSS, the card industry’s security standard, set June 30, 2018 as the deadline to turn off SSL and “early TLS”, and strongly encourages TLS 1.2.
  • Old clients. Anything that still connects with TLS 1.0 or 1.1, such as an old device or integration, stops working when you turn them off. If you’re not sure, log the version first: nginx can log it with the $ssl_protocol variable.

How to fix it: allow only TLS 1.2 and 1.3. That’s the “intermediate” configuration that Mozilla’s guidelines, now kept by TLSRef, recommend for general-purpose servers. Settings for common servers are below.

It only accepts TLS 1.0 or 1.1

The server completes a handshake only with TLS 1.0 or 1.1, and refuses 1.2 and 1.3. Browsers stopped supporting those versions in 2020, so they can’t connect at all. This is a problem.

It usually means the server software or its TLS library is very old. TLS 1.2 needs OpenSSL 1.0.1 or later, and TLS 1.3 needs OpenSSL 1.1.1.

How to fix it:

  1. Update the server, its operating system, or its TLS library.
  2. Turn on TLS 1.2 and 1.3, using the settings below.
  3. If you can’t update it soon, put a CDN or reverse proxy in front of it that accepts TLS 1.2 and 1.3.

It doesn’t offer TLS 1.3

The server accepts TLS 1.2 but refuses 1.3. Every current browser can still connect, so this isn’t a problem; the answer just mentions it.

TLS 1.3 connects faster: a new connection needs one round trip to set up, where TLS 1.2 needs two. It also drops older options that TLS 1.2 still allows, such as key exchanges without forward secrecy.

How to fix it: add TLS 1.3 to the server’s allowed versions. Your TLS library needs to support it, such as OpenSSL 1.1.1 or later. On Cloudflare and similar services, it’s a setting.

Your provider’s guides

nginx: set ssl_protocols in the http block:

ssl_protocols TLSv1.2 TLSv1.3;

This is nginx’s default since version 1.23.4, so you may only need to remove an older setting. Set it in the http block rather than one server block: for a server block, nginx can use the default server’s value instead.

Apache: set SSLProtocol in the server-wide config so every virtual host gets it:

SSLProtocol -all +TLSv1.2 +TLSv1.3

Apache’s default, all -SSLv3, includes TLS 1.0 and 1.1.

Cloudflare: in the dashboard, go to the Edge Certificates page and set Minimum TLS Version to TLS 1.2. Turn on TLS 1.3 on the same page. These cover visitors’ connections to Cloudflare, not Cloudflare’s connection to your server. Cloudflare Pages hostnames don’t have this setting.

To test from your own machine, OpenSSL needs its security level lowered for old versions too:

openssl s_client -connect example.com:443 -servername example.com -tls1_1 -cipher 'DEFAULT:@SECLEVEL=0' </dev/null

A server that refuses TLS 1.1 answers with an alert such as tlsv1 alert protocol version.

More guides:

What we can’t tell from outside

We try each version once, from one server, to the first public address. Other servers behind the same name may be set up differently. We don’t test every cipher, so a server can accept TLS 1.2 with weak ciphers and we won’t say so. A version that timed out is shown as not tried, not as refused.

Sources

Last reviewed .