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 SSLProtocol
lí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.1
y +/-TLSv1.2
no 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.
Respuestas:
Intrigado por este error (y sí, he podido reproducirlo), eché un vistazo al código fuente de la última versión estable
mod_ssl
y encontré una explicación. Tenga paciencia conmigo, esto se volverá desbordante de pila de aficionados:Cuando
SSLProtocol
se ha analizado, da como resultado unchar
aspecto similar a este:Al iniciar un nuevo contexto de servidor, TODOS los protocolos disponibles se habilitarán, y lo anterior
char
se 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
SSLProtocol
no 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:
SSLProtocol
se analiza en la línea 925 enpkg.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.c
adelante, después de lo cual se deshabilitan protocolos específicos en las líneas posteriores¿Cómo deshabilitarlo entonces?
Tienes pocas opciones:
Protocols All,-TLSv1.1,-TLSv1.2
mod_ssl
;-)fuente
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.cnf
y en Windows 7 en%systemdrive%\openssl\openssl.cnf
.SSLProtocol
de 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.)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:
fuente
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:
Y otro aquí: ¿es posible configurar un protocolo SSL en Apache para un solo VirtualHost (poodle)? . Según vallismortis:
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.
fuente