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

Строгое соответствие SNI для Apache

У меня есть несколько виртуальных хостов SSL и хостов без SSL, обслуживаемых с одного сервера. Если к одному из vhosts, отличных от ssl, осуществляется доступ с использованием «https», используется первая директива SSL. Есть ли какие-то настройки, позволяющие использовать только vhosts с явно совпадающими именами серверов?

Итак, допустим, у меня есть www.a.com, www.b.com, и www.c.com.

Допустим, у меня тоже есть https://www.a.com и https://www.b.com.

Если я пойду в https://www.c.com, это то же самое, что и использование сайта https://www.a.com. Это нежелательное поведение. Могу ли я что-то настроить, чтобы ни один сайт не использовался?

У вас должен быть виртуальный хост по умолчанию для SSL-соединений. Но он не обязательно должен содержать какой-либо контент, поэтому вы можете создать новый виртуальный хост для этой цели и использовать самозаверяющий сертификат.

Этот виртуальный хост по умолчанию должен быть настроен для поддержки новой версии SSL, достаточной для получения SNI от клиента [источник: Apache Wiki]. Его можно настроить с помощью SSLStrictSNIVHostCheck запретить клиентам без поддержки SNI.

Насколько я могу судить по этим ссылкам, клиенты, которые действительно поддерживают SNI, но сообщают о доменном имени, для которого у вас нет явного соответствия vhost, всегда будут находиться на vhost по умолчанию, поэтому вам может понадобиться один без контента .

Ни один из подходов не подходит для домена без HTTPS, так как он не даст хорошего взаимодействия с пользователем. Вместо этого я рекомендую вам либо поддерживать HTTPS на всех своих доменах (можно получить сертификат бесплатно), либо вместо этого использовать разные IP-адреса для доменов с поддержкой HTTPS и без нее.

Я не верю, что Apache просто прочитает первый порт 443, который он видит, и представит его пользователю.

Вы можете предоставить пустой каталог со страницей .htaccess внутри, которая могла бы улавливать то, что входит, и перенаправлять на http-версию. Вы можете сделать это, используя следующее:

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

Не забудьте поместить конфигурацию httpd.conf для каталога .htaccess в начало, перед первой записью 443.

Используйте один IP-адрес для виртуальных хостов, которые не используют SSL, и отдельный IP-адрес для виртуальных хостов, которые используют SSL. Убедитесь, что ваш Listen и VirtualHost директивы для SSL указывают этот IP-адрес явно, а не, например, *:443.