Ви можете встановити 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 які не знають клієнти не може отримати доступ до цього конкретного віртуального хосту .