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

Почему httpd обрабатывает запросы на неправильные имена хостов в режиме SSL?

У меня есть виртуальный хост с поддержкой SSL для моих сайтов по адресу example.com:10443

Listen 10443
<VirtualHost _default_:10443>
  ServerName example.com:10443
  ServerAdmin admin@example.com
  ErrorLog "/var/log/httpd/error_log"
  TransferLog "/var/log/httpd/access_log"
  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  SSLCertificateFile "/etc/ssl/private/example.com.crt"
  SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
  SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
  SSLCACertificateFile "/etc/ssl/private/StartCom.pem"
</VirtualHost>

Сидя в https://example.com:10443/ работает как положено. Однако также просматривая https://subdomain.example.com:10443/ (с установленным DNS) показывает мне те же страницы (после предупреждения о сертификате SSL). Я ожидал директивы ServerName example.com:10443 чтобы отклонить все попытки подключения к другим именам серверов.

Как я могу сказать виртуальному хосту, чтобы он не обслуживал запросы для URL-адресов, отличных от URL-адреса верхнего уровня?

Вы не включили NameVirtualHost так что _default_ отправит любое соединение с вашим сервером в config. Попробуйте вот так. Я добавил интервал для удобства чтения

NameVirtualHost *:10443
Listen 10443

<VirtualHost *:10443>
  ServerName example.com:10443
  ServerAlias example.com:10443
  ServerAdmin admin@example.com

  ErrorLog "/var/log/httpd/error_log"
  TransferLog "/var/log/httpd/access_log"

  SSLEngine on
  SSLProtocol all -SSLv2
  SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5
  SSLCertificateFile "/etc/ssl/private/example.com.crt"
  SSLCertificateKeyFile "/etc/ssl/private/example.com.key"
  SSLCertificateChainFile "/etc/ssl/private/sub.class1.server.ca.pem"
  SSLCACertificateFile "/etc/ssl/private/StartCom.pem"

</VirtualHost>

Вы, кажется, не используете NameVirtualHost вариант, чтобы Apache не беспокоился о проверке имени хоста сервера в запросе, отправленном клиентом. Запрос будет направлен первому VirtualHost раздел, где совпадает IP: порт, и все. Какое бы имя хоста вы ни использовали, не имеет значения, вы получите точно такой же веб-сайт. Это называется сопоставлением виртуальных хостов на основе IP.

Проверять, выписываться http://httpd.apache.org/docs/2.2/vhosts/details.html для полной семантики сопоставления виртуальных хостов, включая результаты использования NameVirtualHost.

Apache всегда находит лучший ip: порт на основе первого прохода, когда доступны только сведения об уровне соединения, затем просматривает имена хостов на втором проходе из того, что осталось (если в 2.2, должна присутствовать директива NameVirtualHost, чтобы разрешить второй шаг )

дефолт такой же как *. Если у вас есть только один виртуальный хост для порта, он будет использоваться независимо от того, есть ли совпадение vhost на основе имени.

Если вы хотите всеобъемлющую информацию для * или определенного IP-адреса, создайте его как первый виртуальный хост в наборе совпадающих комбинаций ip: port. Оттуда вы можете отказаться от чего-либо.