¿Cómo deshabilitar TLS 1.1 y 1.2 en Apache?

13

Tengo un servidor Ubuntu 12.04.2 LTS que ejecuta Apache 2.2.22 con mod_ssl y OpenSSL v1.0.1.

En mi configuración de vhosts (todo lo demás dentro de lo que se comporta como esperaría), tengo la SSLProtocollínea con -all +SSLv3.

Con esa configuración, TLS 1.1 y 1.2 están habilitados y funcionan correctamente, lo cual es contraintuitivo para mí, ya que esperaría que solo SSLv3 se habilitara dada esa configuración.

Puedo habilitar / deshabilitar TLSv1 perfectamente -/+TSLv1, y funciona como se esperaba. Sin embargo, +/-TLSv1.1y +/-TLSv1.2no son opciones de configuración válidas - así que no les puedo desactivar esa manera.

En cuanto a por qué querría hacer esto, estoy tratando con una aplicación de terceros (sobre la cual no tengo control) que tiene un comportamiento defectuoso con los servidores habilitados para TLS, y necesito deshabilitarla por completo para seguir adelante.

Kyle Lowry
fuente
solo por curiosidad, ¿podría preguntarle por qué desea deshabilitar TSL en primer lugar? por lo que reuní, se supone que es más seguro que SSLv1 / 2/3, por lo que solo puedo imaginar razones para querer permitir solo v1.2 y no v1.1 (eso es lo que me trajo aquí), pero no para deshabilitarlo a favor de SSL, excepto tal vez algunos problemas de compatibilidad con software anterior?
codeling
@codeling Trabajar con software antiguo de terceros que tiene errores con TLS.
Kyle Lowry

Respuestas:

23

Intrigado por este error (y sí, he podido reproducirlo), eché un vistazo al código fuente de la última versión estable mod_ssly encontré una explicación. Tenga paciencia conmigo, esto se volverá desbordante de pila de aficionados:

Cuando SSLProtocolse ha analizado, da como resultado un charaspecto similar a este:

0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1

Al iniciar un nuevo contexto de servidor, TODOS los protocolos disponibles se habilitarán, y lo anterior charse inspecciona utilizando algunas ingeniosas operaciones AND a nivel de bits para determinar qué protocolos deben deshabilitarse . En este caso, donde SSLv3 es el único protocolo que se ha habilitado explícitamente, los otros 3 se deshabilitarán.

OpenSSL admite una configuración de protocolo para TLSv1.1, pero como SSLProtocolno tiene en cuenta estas opciones, nunca se desactiva. OpenSSL v1.0.1 tiene algunos problemas conocidos con TLSv1.2, pero si es compatible, supongo que lo mismo ocurre con TLSv1.1; no es reconocido / manejado por mod_ssl y, por lo tanto, nunca está deshabilitado.

Referencias de código fuente para mod_ssl:

SSLProtocolse analiza en la línea 925 en pkg.sslmod/ssl_engine_config.c
Las opciones utilizadas en la función anterior se definen en la línea 444 en pkg.sslmod/mod_ssl.h
Todos los protocolos se habilita en la línea 586 en pkg.sslmod/ssl_engine_init.cadelante, después de lo cual se deshabilitan protocolos específicos en las líneas posteriores

¿Cómo deshabilitarlo entonces?

Tienes pocas opciones:

  1. Deshabilítelo en el archivo de configuración de OpenSSL con:
    Protocols All,-TLSv1.1,-TLSv1.2
  2. Reescribir mod_ssl;-)
Mathias R. Jessen
fuente
Parece una respuesta perfecta, solo necesita verificar: ¿qué / qué / dónde archivo de configuración de OpenSSL?
Kyle Lowry
openssl.cnf- La ubicación depende de la instalación. En Debian Squeeze lo encontré en /etc/ssl/openssl.cnf, en OS X en /System/Library/OpenSSL/openssl.cnfy en Windows 7 en %systemdrive%\openssl\openssl.cnf.
Mathias R. Jessen
1
Estoy mirando el archivo de configuración ahora; la sintaxis se ve un poco diferente de lo que esperaría en función de su respuesta, y parece que no puedo encontrar nada en línea que explícitamente indique que puede controlar los protocolos que están habilitados / deshabilitados desde ese archivo de configuración. ¿Tienes alguna referencia para eso? Gracias.
Kyle Lowry
Otra opción: usar: SSLProtocolde la misma manera anterior ( SSLProtocol All -TLSv1.1 -TLSv1.2(no se necesitan comas)) pero bajo una configuración global o específica de Apache para 'anular' cualquier configuración global SSL mencionada anteriormente. (Si no desea cambiar todos los cifrados SSL subyacentes -> Dado que el cifrado que necesita se considera débil.)
bshea
2

El problema también se aborda en los comentarios en la página mod_ssl Apache: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136

Si Ubuntu 12.04 tuviera Apache 2.2.23, el problema no habría ocurrido. Según los comentarios, es posible habilitar TLSv1.1 y TLSv1.2, pero TLSv1.0 también está habilitado:

SSLProtocol All -SSLv2 -SSLv3
Coanda
fuente
1

En primer lugar, debe identificar cuál es el vhost predeterminado para el puerto 443 en su servidor (el primer vhost SSL cargado por Apache) y editar su archivo de configuración. La mayoría de los usuarios tienen un archivo ssl.conf en sus servidores, con un vhost para el puerto 443 configurado allí. Como el nombre de este archivo comienza con "s", se cargará antes de los vhosts configurados en vhosts.conf (que comienza con "v"). Por lo tanto, verifique si este es su caso (la respuesta es "sí" para prácticamente todos) y cambie los protocolos en ese archivo . ¡Eso es suficiente!

Aquí se publicó un problema similar: ¿Cómo deshabilitar TLS 1.1 y 1.2 en Apache? . De acuerdo con HBruijn:

A menos que tenga IP VirtualHosts, en la práctica, la configuración desde la primera aparición de la directiva SSLProtocol se usa para todo el servidor y / o todos los VirtualHosts basados ​​en nombres que admiten TLS

Y otro aquí: ¿es posible configurar un protocolo SSL en Apache para un solo VirtualHost (poodle)? . Según vallismortis:

Puede configurar SSLProtocol solo para el primer VirtualHost en el archivo de configuración. Todas las entradas posteriores de VirtualHost heredarán esa configuración de la primera entrada e ignorarán silenciosamente su propia configuración debido a un error de OpenSSL.

Por cierto: el vhost predeterminado en un servidor, para un puerto determinado, es el que responde a las solicitudes de ese puerto, que llegan al servidor sin una identificación del nombre del servidor (o con un nombre de servidor incorrecto). Ejemplo: una IP escrita en la barra de direcciones de su navegador o una redirección errónea causada por una tabla DNS incorrecta.

aldemarcalazans
fuente