La confusión proviene de la forma en que OpenSSL expresa sus opciones de configuración.
En el protocolo, hay dos cosas muy distintas:
La versión del protocolo . Esto puede ser SSL 3.0, TLS 1.0, TLS 1.1 o TLS 1.2 (o algo más, aún no definido). Internamente, la versión se codifica como un entero de 16 bits de valor 0x0300, 0x0301, 0x0302 o 0x0303, respectivamente (por lo que TLS 1.0 realmente es "SSL 3.1" en el cable). (No estoy hablando de SSL 2.0 aquí).
Las suites de cifrado . Estos son identificadores de 16 bits (por cable) para las combinaciones de algoritmos criptográficos que el cliente y el servidor están dispuestos a usar. El cliente envía una lista, el servidor elige la que se utilizará. La mayoría de las suites de cifrado funcionan para SSL 3.0, TLS 1.0 y TLS 1.1; Algunas suites de cifrado recientes solo funcionan con TLS 1.2 porque utilizan funciones de protocolo que están disponibles solo con TLS 1.2.
OpenSSL utiliza, en su cadena de configuración para especificar una lista de conjuntos de cifrado, algunos mnemónicos como "SSLv3". En ese contexto , "SSLv3" no significa "protocolo versión 0x0300"; significa "la lista de conjuntos de cifrado que pueden funcionar con SSLv3". Cuando escriba "! SSLv3" en la configuración de la lista de conjuntos de cifrado admitidos, debe leerlo como "eliminar todos los conjuntos de cifrado que puedan funcionar con SSL 3.0". Pero esto NO es: "elimine todos los conjuntos de cifrado que podrían funcionar con SSL 3.0 cuando en realidad use SSL 3.0 ". La eliminación es todo o nada; no puede eliminar el soporte de forma condicional en la versión del protocolo (eso sería conceptualmente factible, pero OpenSSL no funciona así).
Por lo tanto, si elimina la compatibilidad con todas las suites de cifrado que podrían funcionar con SSL 3.0, también eliminará las suites de cifrado para versiones de protocolo posteriores. En particular, dado que SSL 3.0, TLS 1.0 y TLS 1.1 usan todos los mismos conjuntos de cifrado, los únicos conjuntos de cifrado que quedan en su lista son los que son específicos de TLS 1.2. En efecto, también acabas de eliminar la compatibilidad con TLS 1.0 y 1.1.
Si usa " !SSLv3:!SSLv2
", el servidor puede fingir para seguir soportando SSL 2.0, pero con una lista vacía de conjuntos de cifrado admitidos, por lo que no llegará muy lejos; un apretón de manos real no va a suceder. Es como dar la llave de tu auto, pero quitar las ruedas.