У меня есть сервер Ubuntu 12.04.2 LTS под управлением 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
выглядит примерно так:После запуска нового серверного контекста будут включены ВСЕ доступные протоколы, и вышеописанное
char
проверяется с использованием некоторых изящных побитовых операций И, чтобы определить, какие протоколы следует отключить . В этом случае, где SSLv3 является единственным протоколом, который был явно включен, остальные 3 будут отключены.OpenSSL поддерживает настройку протокола для TLSv1.1, но поскольку эти параметры
SSLProtocol
не учитываются, он никогда не отключается. OpenSSL v1.0.1 имеет некоторые известные проблемы с TLSv1.2, но если он поддерживается, я полагаю, что то же самое относится и к TLSv1.1; он не распознается / не обрабатывается mod_ssl и поэтому никогда не отключается.Ссылки на исходный код для 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
;-)источник
openssl.cnf
- расположение зависит от установки. В Debian squeeze я нашел его/etc/ssl/openssl.cnf
в OS X в/System/Library/OpenSSL/openssl.cnf
Windows 7 и в%systemdrive%\openssl\openssl.cnf
.SSLProtocol
таким же образом, как указано выше (SSLProtocol All -TLSv1.1 -TLSv1.2
(запятые не нужны)), но в глобальной или специальной конфигурации Apache, чтобы «переопределить» любую глобальную конфигурацию SSL, упомянутую выше. (Если вы не хотите менять все базовые шифры SSL -> Поскольку необходимый вам шифр считается слабым.)Проблема также решена в комментариях на странице Apache mod_ssl: 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:
источник
Прежде всего, вы должны определить, какой vhost по умолчанию для порта 443 на вашем сервере (первый SSL-хост, загруженный Apache), и отредактировать его файл конфигурации. У большинства пользователей на серверах есть файл ssl.conf , на котором настроен vhost для порта 443. Поскольку имя этого файла начинается с "s", он будет загружен до vhosts, настроенного в vhosts.conf (который начинается с "v"). Итак, проверьте, является ли это вашим случаем (ответ «да» практически для всех) и измените протоколы в этом файле . Достаточно!
Похожая проблема была опубликована здесь: Как отключить TLS 1.1 и 1.2 в Apache? , По словам Х.Бруйна:
И еще одно: возможно ли установить SSLProtocol в Apache для одного VirtualHost (пуделя)? , По словам Валлизмортиса:
Кстати, vhost по умолчанию на сервере для данного порта - это тот, который отвечает на запросы для этого порта, которые поступают на сервер без идентификации имени сервера (или с неправильным именем сервера). Пример: IP-адрес, введенный в адресной строке вашего браузера, или ошибочное перенаправление, вызванное неверной таблицей DNS.
источник