Чи можна встановити 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, чи є ще щось тонке, що спричиняє налаштування не приймати та / або працювати.

Відповіді:


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хост за замовчуванням.


Додаткова інформація, яку додав @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>

Крім того, якщо він вам потрібен лише для тестування, ви можете використовувати інший порт замість іншого IP-адреси, наприклад звичайний альтернативний порт HTTPS 8443.
Еса Йокінен

0

Якщо ви використовуєте вказівку імені сервера (SNI) зі своїм vhost, ви не можете визначити кілька версій SSL.

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


-2

Або ви можете використовувати:

SSLProtocol TLSv1 TLSv1.1 TLSv1.2

Я тестувався на багатьох серверах і працює для мене! Ви можете протестувати свій сайт на цьому веб-сайті


4
Ця лінія SSLProtocol виглядає лише так, що працює, тому що Apache на це не скаржиться. Насправді використовується лише SSLProtocol у першій статті VirtualHost.
vallismortis
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.