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

13

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

Кайл Лоури
источник
просто из любопытства - могу ли я спросить, почему вы хотите отключить TSL? Исходя из того, что я понял, он должен быть более безопасным, чем SSLv1 / 2/3, так что я могу только представить причины, по которым я хотел бы разрешить только v1.2, а не v1.1 (вот что привело меня сюда), но не отключить его в пользу SSL, за исключением, может быть, некоторых проблем совместимости со старым программным обеспечением?
кодирование
@codeling Работа со старым, сторонним программным обеспечением, имеющим ошибки с TLS.
Кайл Лоури

Ответы:

23

Заинтригованный этой ошибкой (и да, я смог ее воспроизвести), я взглянул на исходный код последней стабильной версии 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;-)
Матиас Р. Ессен
источник
Выглядит как идеальный ответ, просто нужно проверить: какой / какой / где конфигурационный файл OpenSSL?
Кайл Лоури
openssl.cnf- расположение зависит от установки. В Debian squeeze я нашел его /etc/ssl/openssl.cnfв OS X в /System/Library/OpenSSL/openssl.cnfWindows 7 и в %systemdrive%\openssl\openssl.cnf.
Матиас Р. Ессен
1
Я сейчас смотрю на файл конфигурации; синтаксис выглядит немного иначе, чем я ожидал, основываясь на вашем ответе, и я не могу найти в Интернете ничего, что бы явно указывало, что вы можете управлять протоколами, которые включены / отключены из этого файла конфигурации. У вас есть ссылки на это? Благодарю.
Кайл Лоури
Другой вариант - использовать: SSLProtocolтаким же образом, как указано выше ( SSLProtocol All -TLSv1.1 -TLSv1.2(запятые не нужны)), но в глобальной или специальной конфигурации Apache, чтобы «переопределить» любую глобальную конфигурацию SSL, упомянутую выше. (Если вы не хотите менять все базовые шифры SSL -> Поскольку необходимый вам шифр считается слабым.)
bshea
2

Проблема также решена в комментариях на странице 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:

SSLProtocol All -SSLv2 -SSLv3
Коанда
источник
1

Прежде всего, вы должны определить, какой vhost по умолчанию для порта 443 на вашем сервере (первый SSL-хост, загруженный Apache), и отредактировать его файл конфигурации. У большинства пользователей на серверах есть файл ssl.conf , на котором настроен vhost для порта 443. Поскольку имя этого файла начинается с "s", он будет загружен до vhosts, настроенного в vhosts.conf (который начинается с "v"). Итак, проверьте, является ли это вашим случаем (ответ «да» практически для всех) и измените протоколы в этом файле . Достаточно!

Похожая проблема была опубликована здесь: Как отключить TLS 1.1 и 1.2 в Apache? , По словам Х.Бруйна:

Если у вас нет IP VirtualHosts, на практике параметры из первого вхождения директивы SSLProtocol используются для всего сервера и / или всех виртуальных хостов на основе имен, поддерживающих TLS.

И еще одно: возможно ли установить SSLProtocol в Apache для одного VirtualHost (пуделя)? , По словам Валлизмортиса:

Вы можете установить SSLProtocol только для первого VirtualHost в файле конфигурации. Все последующие записи VirtualHost будут наследовать эту настройку от первой записи и молча игнорировать свои собственные настройки из-за ошибки OpenSSL.

Кстати, vhost по умолчанию на сервере для данного порта - это тот, который отвечает на запросы для этого порта, которые поступают на сервер без идентификации имени сервера (или с неправильным именем сервера). Пример: IP-адрес, введенный в адресной строке вашего браузера, или ошибочное перенаправление, вызванное неверной таблицей DNS.

aldemarcalazans
источник