Вы можете установить 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
ваш хост по умолчанию.
SSLStrictSNIVHostCheck
очень ценится. Однако из цитируемой документации также следует отметить, что при включении на любом другом виртуальном хосте клиентам, не знакомым с SNI, не разрешается доступ к этому конкретному виртуальному хосту .