У меня есть LTS-сервер Ubuntu 12.04.2 с Apache 2.2.22 с mod_ssl и OpenSSL v1.0.1.
В моей конфигурации vhosts (все остальное, что ведет себя так, как я ожидал) у меня есть SSLProtocol
линия с -all +SSLv3
.
В этой конфигурации TLS 1.1 и 1.2 включены и работают правильно, что мне противоречит интуиции, поскольку я ожидал, что только SSLv3 будет включен при такой конфигурации.
Я могу включить / отключить TLSv1 просто с помощью -/+TSLv1
, и он работает должным образом. Но +/-TLSv1.1
и +/-TLSv1.2
не являются допустимыми параметрами конфигурации, поэтому я не могу их отключить таким образом.
Что касается того, почему я хочу это сделать - я имею дело со сторонним приложением (которое я не контролирую), у которого есть некоторые ошибки с серверами с поддержкой TLS, и мне нужно полностью отключить его, чтобы двигаться вперед.
Заинтригованный этой ошибкой (и да, мне удалось ее воспроизвести), я взглянул на исходный код последней стабильной версии mod_ssl
и нашел объяснение. Потерпите меня, это будет переполнено любителями:
Когда SSLProtocol
был проанализирован, это приводит к char
выглядит примерно так:
0 1 0 0
^ ^ ^ ^
| | | SSLv1
| | SSLv2
| SSLv3
TLSv1
После запуска нового контекста сервера будут включены ВСЕ доступные протоколы, и указанные выше char
проверяется с помощью отличных побитовых операций И, чтобы определить, какие протоколы должны быть отключен. В этом случае, когда SSLv3 является единственным протоколом, который был явно включен, остальные 3 будут отключены.
OpenSSL поддерживает настройку протокола для TLSv1.1, но поскольку SSLProtocol
не учитывает этот параметр, он никогда не отключается. OpenSSL v1.0.1 имеет некоторые известные проблемы с TLSv1.2, но если он поддерживается, я полагаю, что то же самое касается и TLSv1.1; он не распознается / не обрабатывается mod_ssl и, следовательно, никогда не отключается.
SSLProtocol
анализируется в строке 925 в pkg.sslmod/ssl_engine_config.c
Параметры, используемые в приведенной выше функции, определены в строке 444 в pkg.sslmod/mod_ssl.h
Все протоколы включаются в строке 586 в pkg.sslmod/ssl_engine_init.c
после чего определенные протоколы отключаются в следующих строках
У вас есть несколько вариантов:
Protocols All,-TLSv1.1,-TLSv1.2
mod_ssl
;-)Проблема также решается в комментариях на странице mod_ssl Apache: http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#comment_1136
Если бы в Ubuntu 12.04 был Apache 2.2.23, проблемы бы не было. Согласно комментариям, можно включить TLSv1.1 и TLSv1.2, но тогда также будет включен TLSv1.0:
SSLProtocol All -SSLv2 -SSLv3
Прежде всего, вы должны определить, что такое vhost по умолчанию для порта 443 на вашем сервере (первый виртуальный хост SSL, загруженный Apache) и отредактируйте его файл конфигурации. У большинства пользователей есть ssl.conf файл на своих серверах с настроенным там виртуальным хостом для порта 443. Поскольку имя этого файла начинается с «s», он загрузится до vhosts, настроенных в vhosts.conf (который начинается с «v»). Итак, проверьте, так ли это в вашем случае (практически для всех ответ «да») и изменить протоколы в этом файле. Достаточно!
Похожая проблема была размещена здесь: Как отключить TLS 1.1 и 1.2 в Apache?. Согласно HBruijn:
Если у вас нет IP VirtualHosts, на практике настройки из первого появления директивы SSLProtocol используются для всего сервера и / или всех виртуальных хостов на основе имен, поддерживающих TLS.
И еще здесь: Можно ли установить протокол SSL в Apache для одного VirtualHost (пуделя)?. Согласно vallismortis:
Вы можете установить SSLProtocol только для первого VirtualHost в файле конфигурации. Все последующие записи VirtualHost будут наследовать этот параметр из первой записи и автоматически игнорировать свои собственные настройки из-за ошибки OpenSSL.
Между прочим: vhost по умолчанию на сервере для данного порта - это тот, который отвечает на запросы для этого порта, которые поступают на сервер без идентификации имени сервера (или с неправильным именем сервера). Пример: IP-адрес, введенный в адресной строке вашего браузера, или ошибочное перенаправление, вызванное неправильной таблицей DNS.