I'm using Apache 2.2.34, OpenSSL 1.0.2l. Yep, I know its sun-setted and not supported, but plans to upgrade it are not immediate.

I'm trying to understand the difference between these two statements. Both seem to restrict the Apache server to TLS 1.2 requests, but the

SSLProtocol all -SSLv2 -SSLv3

SSLProtocol TLSv1.1 TLSv1.2 -SSLv2 -SSLv3

Both seemingly restrict the server to TLSv1.2, at least according to www.ssllabs.com, so I'm not sure why one of our users had a problem with the second, which was used on a test server, and not the first, which is production. They said they needed to update their solution to use TLSv1.2. Would someone be able to clarify what is happening here?

  • "but the ...." - it looks like something is omitted here?
    – DocRoot
    Mar 28, 2019 at 18:42
  • Please define "one of our users had a problem with the second". What problem? Did the TLS handshake failed? Or succeeded with another version than expected? Which client was it? Was it tried with another client from same computer, like openssl s_client? Mar 28, 2019 at 18:54

1 Answer 1


Based on https://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslprotocol:


This is a shortcut for "+SSLv2 +SSLv3 +TLSv1" or - when using OpenSSL 1.0.1 and later - "+SSLv2 +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2", respectively.

So first, there would be a need to know which OpenSSL version you use.

Let us rewrite your statements:

1) before OpenSSL 1.0.1:

 SSLProtocol all -SSLv2 -SSLv3


 SSLProtocol +SSLv2 +SSLv3 +TLSv1 -SSLv2 -SSLv3

which should probably mean

 SSLProtocol +TLSv1

2) after OpenSSL 1.0.1

then it becomes with the same reasoning

 SSLProtocol +TLSv1 +TLSv1.1 +TLSv1.2

The other directive you have is:

 SSLProtocol TLSv1.1 TLSv1.2 -SSLv2 -SSLv3

This directive does not say anything about TLSv1 (which is 1.0 in fact) so the two statements are not equivalent.

One allows TLS 1.0 (the SSLProtocol all -SSLv2 -SSLv3) where the other (SSLProtocol TLSv1.1 TLSv1.2 -SSLv2 -SSLv3) allows only TLS 1.1 and 1.2

Hence, a client supporting at most TLS 1.0 will be able to connect to first case, not to second one.

But like I said in my comment, you are not describing in details what was the client problem. TLS handshake details would be needed, both from his side and from Apache logfiles.

You can emulate connections by using something like openssl s_client and providing specific flags to force the TLS version and see if the webserver replies. Or a tool like https://testssl.sh/ or analyze-ssl.pl at https://github.com/noxxi/p5-ssl-tools

Final notes:

  • nowadays, except for very good reason (like a client that you can absolutely not update), you should enable only 1.2 (or later). Various references and norms go into this direction, both at government levels, industry guidelines (like PCI-DSS), or technical standards (like at the IETF)
  • the above is only a best guess, as there may still be a default list of versions, either in Apache or in openssl, that can come into mix, and may make a difference between saying +TLSv1.2 vs just TLSv1.2 (first case you add the value to an existing default list, second case you may just replace current default list by only one value).
  • Using OpenSSL 1.0.2l. Mar 28, 2019 at 22:04
  • Yeah, I need to get more details from the vendor. They said they updated their application (PHP based I believe) to support TLSv1.2. So maybe they were using TLSv1.0? Mar 28, 2019 at 22:05
  • They may have upgraded to 1.0.2, alongside PHP, to enable TLS 1.1 and 1.2 (which were added in OpenSSL 1.0.1, so I guess they were in some 0.9 version before). Note that from OpenSSL website: "Version 1.0.2 will be supported until 2019-12-31 (LTS)." Mar 28, 2019 at 22:56

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.