
У меня есть веб-сервер 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.