Назад | Перейти на главную страницу

Как отключить TLS 1.1 и 1.2 в Apache?

У меня есть 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 и, следовательно, никогда не отключается.

Исходный код Ссылки для mod_ssl:

SSLProtocol анализируется в строке 925 в pkg.sslmod/ssl_engine_config.c
Параметры, используемые в приведенной выше функции, определены в строке 444 в pkg.sslmod/mod_ssl.h
Все протоколы включаются в строке 586 в pkg.sslmod/ssl_engine_init.c после чего определенные протоколы отключаются в следующих строках

Как потом отключить?

У вас есть несколько вариантов:

  1. Отключите его в файле конфигурации OpenSSL с помощью:
    Protocols All,-TLSv1.1,-TLSv1.2
  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.