Несколько доменов и SSL: все домены используют мой сертификат SSL, но я не хочу?
У меня есть сертификат SSL с подстановочным знаком на моем сервере Apache. Он отлично работает с моим доменом, но ошибка в том, что он работает со всеми доменами на моем сервере apache! И я не хочу этого, когда я захожу на https://www.mywebsitewithouthttps.com/, firefox говорит мне, что страница не защищена, потому что сертификат предназначен для www.mydomainwithhttps.com. Если я добавлю исключение для этой ошибки SSL в моем браузере, то будет отображаться не "mywebsitewithouthttps.com", а "mydomainwithhttps.com" (по этому адресу: https://www.mywebsitewithouthttps.com/)!
Я не хочу, чтобы мой сертификат работал на все остальные домены! Это большая проблема, потому что Google сканирует и индексирует все мои другие домены по HTTPS с содержимым mydomainwithhttps.com:-(
Это мой виртуальный хост для SSL:
NameVirtualHost *:443
<VirtualHost *:443>
ServerName www.mydomainwithhttps.com
DocumentRoot "/home/mydomainwithhttps/www"
suPHP_Engine On
suPHP_AddHandler x-httpd-php
suPHP_UserGroup mydomainwithhttps users
AddHandler x-httpd-php .php
SSLEngine on
SSLCertificateFile /certificates/ssl_certificate.crt
SSLCertificateKeyFile /certificates/www.mydomainwithhttps.com.key
SSLCACertificateFile /certificates/IntermediateCA.crt
</VirtualHost>
2 ответа
Если вы сделаете HTTPS-запрос, клиент установит TCP-соединение с соответствующим IP-адресом и портом (обычно 443) на сервере. Если соединение установилось успешно, он запустит TLS-квитирование и во время TLS-квитирования получит сертификат для проверки.
Если у вас есть несколько серверов с одним и тем же IP-адресом и портом, они все используют один и тот же прослушиватель TCP. Поскольку попытка TCP-соединения не содержит информации об имени целевого сервера, а содержит только IP-адрес и порт целевого устройства, слушатель будет принимать все попытки подключения, даже если для (пока неизвестного) целевого имени хоста не настроен HTTPS.
Современные клиенты затем отправляют целевое имя хоста в квитировании TLS, и только тогда сервер знает, чего хочет клиент. Если для запрошенного имени настроен HTTPS, сервер может отправить соответствующий сертификат. Если HTTPS не настроен для этого имени, сервер либо отправит сертификат по умолчанию, либо закроет соединение (возможно, отправит предупреждение TLS при закрытии).
В итоге это оставляет вам следующие возможности:
- Используйте разные IP-адреса для сайтов HTTPS и сайтов, отличных от HTTPS. Таким образом, TCP-соединение уже не будет установлено, потому что сервер не прослушивает соединения через этот IP: порт.
- Сконфигурируйте свой сервер так, чтобы он возвращал ошибку, когда клиент запрашивает имя хоста, для которого не настроен HTTPS. Таким образом, клиент, вероятно, получит странное сообщение об ошибке HTTPS в браузере. Я не уверен, но, возможно, вы можете настроить Apache таким образом при использовании
SSLStrictSNIVHostCheck on
вариант. Если эта опция не помогает, то apache может не поддерживать такой тип установки. - Настройте сервер на использование сертификата по умолчанию (обычно это первый настроенный сертификат), если имя не совпадает или клиент не поддерживает SNI. Клиент получит предупреждение о несоответствии сертификата в браузере. Эта настройка у вас есть в настоящее время.
- Правильно настройте HTTPS для всех доменов, используя отдельные сертификаты или включив их все в один сертификат.
Таким образом, чтобы убедиться, что боты не предполагают, что ваш сайт может использовать HTTPS, вам нужно выбрать вариант 1 или 2. Обратите внимание, что во всех этих случаях вы ожидаете, что боты будут поддерживать SNI, что не все делают. Поэтому для лучшей совместимости вам необходимо использовать отдельный IP-адрес для каждого сайта HTTPS.
Вы можете настроить мультидомен с SSL и разными сертификатами как на UBUNTU, так и на RHEL, выполнив команду multi donain с помощью ssl.
Проблема в том, что Apache попытается найти конфигурацию для https://www.mywebsitewithouthttps.com/ а если этого не произойдет, по умолчанию он вернется к первой конфигурации https (для mydomainwithhttps).
Это будет свидетельствовать об ошибке, но, как вы видели, если вы нажмете, вы увидите не тот сайт.
Однако я не могу понять, как Google сканирует и индексирует сайт. Я бы подумал, что он остановился бы, когда увидел ошибку сертификата? Я был бы очень удивлен, если это не так, но если это не так, вы можете включить правило перезаписи для этих имен хостов a, чтобы перенаправить обратно на http.
Есть только 2 способа обойти это:
- Получить сертификаты для других доменов, чтобы вы могли подключиться через https. Вы все еще можете перенаправить обратно на http, если вы действительно хотите.
- Разделите серверы с https на другой сервер (или другой IP-адрес на том же сервере и настройте конфигурацию Apache для прослушивания порта 443 только по IP-адресу https).
Именно так работает Apache (и большинство - если не все - другие веб-серверы).