Можно ли установить SSLProtocol в Apache для одного VirtualHost (пудель)?

13

Я пытаюсь протестировать исправление для уязвимости пуделя, которая включает отключение SSLv3 на моем веб-сервере. Для того, чтобы сначала протестировать это в непроизводственной среде, я устанавливаю SSLProtocol на VirtualHost для другого тестового сервера. Мой конфиг выглядит примерно так:

<VirtualHost *:443>
    SSLEngine On
    SSLProtocol All -SSLv2 -SSLv3
    ServerName test.mysite.com
    # bunch of other stuff omitted
</VirtualHost>

Однако даже после перезапуска apache мой тестовый сайт все еще считается уязвимым. Ожидается ли это работать? Мне интересно, должен ли я установить его в глобальном конфиге ssl или есть что-то еще тонкое, что приводит к тому, что настройка не работает и / или не работает.

Cory
источник

Ответы:

16

Вы можете установить 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 и слегка протестирован.

Это проверяет версию соединения по SSLProtocol, настроенному для виртуального хоста, который сопоставляется на основе SNI. Поскольку соединение первоначально устанавливается с SSLProtocol, настроенным для хоста по умолчанию для порта, хост по умолчанию должен включать все протоколы, которые будут поддерживаться любым виртуальным хостом.

Этот патч добавляет дополнительный статус возврата APR_EMISMATCH к функции init_vhost, чтобы обратный вызов ssl_callback_ServerNameIndication, зарегистрированный в OpenSSL, мог возвращать фатальное предупреждение SSL_AD_PROTOCOL_VERSION. Это предназначено для получения того же ответа на ClientHello, что и с указанным SSLProtocol, который не включает данную версию. Поскольку обратный вызов SNI вызывается во время обработки ClientHello и до того, как будет получен ответ, кажется, он делает именно это.

Если вы вдруг видите сообщения следующего формата:

Rejecting version [version] for servername [hostname]

Затем вы должны дважды проверить SSLProtocolваш хост по умолчанию.

vallismortis
источник
Дополнительная информация, добавленная @anx относительно SSLStrictSNIVHostCheckочень ценится. Однако из цитируемой документации также следует отметить, что при включении на любом другом виртуальном хосте клиентам, не знакомым с SNI, не разрешается доступ к этому конкретному виртуальному хосту .
vallismortis
5

Вы можете иметь разные протоколы SSL для каждого Vhost, если они прослушивают разные 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>
BitLegacy01
источник
Также, если вам это нужно только для целей тестирования, вы можете использовать другой порт вместо другого IP, например, общий альтернативный порт HTTPS 8443.
Эса Йокинен
0

Если вы используете указатель имени сервера (SNI) с вашим vhost, вы не можете определить несколько версий SSL.

Однако, если вы используете выделенный сервер, вы, вероятно, сможете добавить еще один IP-адрес на ваш сервер. Таким образом, вы сможете использовать разные версии SSL для каждого IP. Вам просто нужно изменить настройки Vhost, как ожидается, IP: 443.

Tryp
источник
-2

Или вы можете использовать:

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

Я был проверен на многих серверах и работает на меня! Вы можете проверить свой сайт на этом сайте

Родриго Морено
источник
4
Эта строка SSLProtocol выглядит так, как будто она работает, потому что Apache не жалуется на это. В действительности используется только SSLProtocol в первой записи VirtualHost.
vallismortis