Я пытаюсь протестировать патч для уязвимость пуделя это включает в себя отключение SSLv3 на моем веб-сервере. Чтобы сначала протестировать это в непроизводственной среде, я устанавливаю SSLProtocol на VirtualHost для другого тестового сервера. Моя конфигурация выглядит примерно так:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
Однако даже после перезапуска apache мой тестовый сайт по-прежнему считается уязвимым. Ожидается, что это сработает? Мне интересно, нужно ли мне устанавливать его в глобальной конфигурации ssl или есть что-то еще тонкое, что заставляет настройку не работать и / или работать.
Вы можете установить SSLProtocol только для первого VirtualHost в файле конфигурации. Все последующие записи VirtualHost будут наследовать этот параметр от первой записи и молча игнорировать свои собственные настройки из-за Ошибка OpenSSL.
Соответствующий отчет об ошибке для mod_ssl, но, как описано в отчете об ошибке, проблема должна быть решена в OpenSSL (сертификат наследуется, но не протоколы).
Наборы шифров должны быть установлены независимо для каждого VirtualHost, в противном случае вы получите список по умолчанию, включающий множество небезопасных шифров. Кроме того, имейте в виду, что более старые клиенты, которые не поддерживают указание имени сервера (SNI), всегда будут использовать хост по умолчанию (если только заблокирован с использованием SSLStrictSNIVHostCheck
), что может затруднить ваше тестирование.
Короче говоря, вы должны иметь возможность указывать настраиваемые наборы шифров и сертификаты для каждого виртуального хоста, но до тех пор, пока ошибка не будет исправлена, не ожидайте правильного поведения с настраиваемыми протоколами для каждого виртуального хоста.
Я столкнулся с этой проблемой с Apache 2.4 и modssl с OpenSSL 1.0.1k, и я ожидаю, что Apache 2.2 будет подвержен тем же проблемам.
Обновление (октябрь 2016 г.): Ошибка OpenSSL была отмечена как исправленная 13 октября 2016 г. Однако она была частью массового закрытия открытых проблем, и хотя было предоставлено «частичное исправление», проблема так и не была устранена полностью.
Обновление (апрель 2018 г.): Повторно отправленная ошибка OpenSSL теперь имеет патч доступен (по состоянию на 9 апреля 2018 г.). Этот патч изменит поведение экземпляров Apache, настроенных с несколькими виртуальными хостами SNI:
Отклонять соединения, не соответствующие протоколу vhost SSLProtocol
Это было разработано и протестировано с 2.4.27 и в производстве с этой версией. Патч был модифицирован для версии 2.4.33 и прошел легкие испытания.
Это проверяет версию соединения по протоколу SSL, настроенному для виртуального хоста, который соответствует на основе SNI. Поскольку соединение изначально выполняется с SSLProtocol, настроенным для хоста по умолчанию для порта, хост по умолчанию должен включать все протоколы, которые будут поддерживаться любым виртуальным хостом.
Этот патч добавляет дополнительный статус возврата APR_EMISMATCH к функции init_vhost, так что обратный вызов ssl_callback_ServerNameIndication, зарегистрированный в OpenSSL, может возвращать фатальное предупреждение SSL_AD_PROTOCOL_VERSION. Это предназначено для создания того же ответа на ClientHello, что и для указанного протокола SSL, который не включает рассматриваемую версию. Поскольку обратный вызов SNI вызывается во время обработки ClientHello и до того, как создается ответ, похоже, что он делает именно это.
Если вы вдруг увидите сообщения следующего формата:
Rejecting version [version] for servername [hostname]
Тогда вам следует дважды проверить свой SSLProtocol
для вашего хоста по умолчанию.
У вас могут быть разные протоколы SSL для каждого виртуального хоста, если они прослушивают другой IP-адрес.
Пример с конкретным хостом, разрешающим TLSv1, а все остальные разрешают только TLSv1.1 и TLSv1.2 - и один разрешает только TLSv1.2:
<VirtualHost *:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3 -TLSv1
ServerName test.mysite.com
# bunch of other stuff omitted
</VirtualHost>
<VirtualHost 10.0.0.2:443>
SSLEngine On
SSLProtocol All -SSLv2 -SSLv3
ServerName test2.mysite.com
</VirtualHost>
<VirtualHost 10.0.0.3:443>
SSLEngine On
SSLProtocol TLSv1.2
ServerName test2.mysite.com
</VirtualHost>
Если вы используете указание имени сервера (SNI) с вашим виртуальным хостом, вы действительно не можете определить несколько версий SSL.
Однако, если вы используете выделенный сервер, вы, вероятно, сможете добавить к своему серверу еще один IP-адрес. Таким образом, вы сможете использовать разные версии SSL для каждого IP-адреса. Вам просто нужно изменить настройки вашего виртуального хоста на ожидаемый IP: 443.