Как настроить Apache для отображения только одного хоста по протоколу HTTPS

Как настроить Apache для отображения только одного хоста по протоколу HTTPS

У меня есть веб-сервер Apache на FreeBSD и я хочу привязать SSL только к одному из многих доменов. Сейчас моя конфигурация такая

NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

Все хорошо, но в браузере включеноhttps://www.domain01.com/показывает страницы сайта ssldomain.com. Это плохо.

Как настроить Apache так, чтобы он не показывал страницы ssldomain.com наhttps://www.domain01.comв браузере.

UPD: Я пытался определить VirtualHosts :80 и :443 для обоих доменов. 1) используя оригинальный SSL ssldomain.com для обоих доменов; 2) используя оригинальный SSL для ssldomain.com и самоподписанный SSL для domain01.com. В обоих случаях браузер показывает ошибку сертификата на HTTPS, но страницы верны.

Конфигурация для этих двух случаев

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCertificateFile "/usr/local/etc/apache22/ssl/domain01.com/server.cert"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/domain01.com/server.key"
# This is for second case (of course 2 lines above are comments)
# SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
# SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
# SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

#Redirect permanent / http://www.domain01.com/
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

С наилучшими пожеланиями!

решение1

Apache по умолчанию будет использовать первый vhost для этого IP (или подстановочные знаки, которые соответствуют, как * в данном случае) и порт (443), если не сможет найти vhost с соответствующим ServerName или ServerAlias. Поэтому вам нужно настроить отдельный сайт для www.domain01.com на порту 443, как вы сделали www.ssldomain.com:443, чтобы он не возвращался к единственному, который у вас есть по умолчанию.

Этот виртуальный хост можно настроить на перенаправление обратно на HTTP, если вы хотите (обратите внимание, что это перенаправление выполняетсяпоследля согласования SSL по-прежнему требуется действительный сертификат — для каждого виртуального хоста SSL требуется настроенный сертификат, хотя вы можете использовать тот же сертификат, если он действителен и для этого виртуального хоста).

В связи с этим, как получается, что вы не получаете ошибку сертификата?https://www.domain01.com? Я предполагаю, что либо это так (и только если вы его проигнорируете, вы увидите содержимое www.ssldomain.com), либо ваш сертификат охватывает оба домена (в этом случае настройка его как отдельного виртуального хоста и перенаправление обратно на http — определенно правильный путь).

Кстати, вопреки распространенному мнению, это так.нетнужен отдельный IP-адрес для настройки нескольких хостов SSL на экземпляре Apache — даже для старых браузеров, которые не поддерживают SNI. Есть еще один способ обойти это. Подробнее см. здесь:Отключение SNI для определенного виртуального хоста на Apache

решение2

У меня это работает, я только меняю порядок доменов: первый — ssldomain.com с оригинальным SSL-сертификатом, а второй — domain01.com с тем же SSL-сертификатом и перенаправлением.

Include etc/apache22/extra/httpd-ssl.conf

NameVirtualHost *:80
NameVirtualHost *:443

<VirtualHost *:80>
DocumentRoot /home/web/web/ssldomain.com
ServerName ssldomain.com
ServerAlias www.ssldomain.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot "/home/web/web/ssldomain.com"
ServerName www.ssldomain.com 
ServerAlias ssldomain.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"
</VirtualHost>

<VirtualHost *:80>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
</VirtualHost>

<VirtualHost *:443>
DocumentRoot /home/web/web/domain01.com
ServerName domain01.com
ServerAlias www.domain01.com
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/apache22/ssl/www.ssldomain.com.crt"
SSLCertificateKeyFile "/usr/local/etc/apache22/ssl/private.key"
SSLCertificateChainFile "/usr/local/etc/apache22/ssl/intermediate.crt"

Redirect permanent / http://www.domain01.com/
</VirtualHost>

Особая благодарность @BazzaDP.

Связанный контент