Назад | Перейти на главную страницу

Почему apache с mod_ssl настроен для одного VirtualHost, отвечающего на запросы к любому домену?

Я только что установил Apache 2.2.18 с включенным mod_ssl и настроен на прослушивание одного IP-адреса на порту 443. Есть много доменов с записью DNS, указывающей на этот IP-адрес. Но я хочу настроить Apache с VirtualHost для определенных доменов с их DocumentRoot.

Моя конфигурация в httpd.conf такова:

Listen          1.2.3.4:443
NameVirtualHost 1.2.3.4:443

<VirtualHost 1.2.3.4:443>
  DocumentRoot /data/www/domain.com
  ServerName www.domain.com
  SSLEngine On
</VirtualHost>

Однако моя проблема и вопрос в том, что этот Apache использует этот VirtualHost для ЛЮБОГО домена, указывающего на тот же IP-адрес. Похоже, он игнорирует параметр "ServerName". Я хочу запускать этот SSL-Apache только на определенных доменах. Кто-нибудь может помочь?

Это происходит из-за того, как работает SSL. Чтобы понять это, вам сначала нужно знать, что на самом деле происходит, когда вы запрашиваете страницу с веб-сайта.

Краткое изложение запроса https://example.com/:

  1. Вы подключаетесь с IP 1.2.3.4 на порт 443
  2. Рукопожатие SSL и обмен ключами. Здесь сертификат вступает в игру
  3. Фактические данные отправляются в зашифрованном виде:

    GET / HTTP/1.1
    Host: www.example.com
    

    Проблема в том, что домен www.example.com будет известно после определения сертификата.

Решение было бы SNI в которой Host поле заголовка отправляется до подтверждения SSL. Это относительно новая технология, которая может поддерживаться не всеми браузерами.

Обычно SSL устанавливается ДО любого соединения в.

Протокол HTTP сообщает, какое имя сервера ВХОДИТ через Host: заголовок.

Итак, SSL установлен ДО того, как известно, какое имя хоста запрашивается.

Чтобы убедиться, что сертификат SSL принимается почти браузерами, вы должны сделать одно из следующих действий:

  1. Создайте Wildcard SSL. Тогда все запросы к * .somedomain.com будут приниматься браузером.

  2. Создайте сертификат SSL со всеми необходимыми вам доменными именами в качестве альтернатив в «Альтернативном имени субъекта». Работает не для всех браузеров, но для большинства основных.

  3. Используйте SNI: http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI это снова работает в основных браузерах ... F.e. наш лучший друг IE6 не поддерживает SNI.