Кажется, что Apache направляет все запросы https первому <VirtualHost *:443>
независимо от совпадения SNI в полях ServerName / ServerAlias.
Apache построен с использованием SNI
Версия сервера: Apache / 2.2.22 (Ubuntu)
Сервер построен: 8 марта 2013 г., 15:53:13
OpenSSL 1.0.1 14 марта 2012 г.
error.log сообщает:
Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
Это говорит о том, что SNI работает согласно http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI (Как узнать, поддерживает ли ваша сборка Apache SNI?)
SSL_TLS_SNI
похоже, устанавливается соответствующим образом при запросе с использованием HTTPS (проверено с помощью phpinfo()
)
Конфигурация:
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to change
# the VirtualHost statement in /etc/apache2/sites-available/default-ssl
# to <VirtualHost *:443>
# Server Name Indication for SSL named virtual hosts is currently not
# supported by MSIE on Windows XP.
NameVirtualHost *:443
Listen 443
</IfModule>
#<VirtualHost *:443>
# <Location />
# Order allow,deny
# Deny from all
# </Location>
#</VirtualHost>
<VirtualHost *:443>
SSLEngine on
ServerAdmin webmaster@localhost
ServerName server.com
ServerAlias server.com
DocumentRoot /web/default
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /path/server.com.crt
SSLCertificateKeyFile /path/server.com.key
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
ServerAdmin webmaster@localhost
ServerName alias.com
ServerAlias alias.com
DocumentRoot /web/default
ErrorLog ${APACHE_LOG_DIR}/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLCertificateFile /path/alias.com.crt
SSLCertificateKeyFile /path/alias.com.key
</VirtualHost>
Обе https://server.com и https://alias.com попробуйте обслужить сертификат (и контент, если вы проигнорируете предупреждение о сертификате) с server.com
Аналогичная конфигурация отлично работает с HTTP: 80 (изменение только SSLEngine и пути сертификата / ключа)
Если я раскомментирую первый виртуальный хост (ограничивая доступ HTTPS к определенным сайтам), я всегда получаю ошибку SSL (даже если это определенный сайт).
Спасибо
РЕДАКТИРОВАТЬ:
Дополнительные флаги
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLStrictSNIVHostCheck on
SSLVerifyClient none
SSLProxyEngine off
SSLStrictSNIVHostCheck on
поэтому он должен поддерживать только браузеры с поддержкой SNI
apache2ctl -S
вывод:
*:443 is a NameVirtualHost
default server server.com (/etc/apache2/sites-enabled/000-default:22)
port 443 namevhost server.com (/etc/apache2/sites-enabled/000-default:22)
port 443 namevhost alias.com (/etc/apache2/sites-enabled/000-default:39)
port 443 namevhost other.com (/etc/apache2/sites-enabled/other:22)
Обновить
Так что по какой-то странной причине проблема, похоже, разрешилась сама собой.
Возможно, это какая-то странная проблема с кешированием или что-то в этом роде (хотя у меня apache2ctl stop/start/restart
и sudo service apache2 stop/start/restart/reload
ed много раз и выполнили тесты локально на сервере, а также на нескольких разных машинах).
Не стесняйтесь снять этот вопрос или оставить его, если он служит какой-либо справкой.
Спасибо за всю помощь, ребята!
Ваша конфигурация выглядит нормально; Включена директива SSLEngine On; Согласно сообщению журнала, похоже, что проблема исходит от клиента.
Не все клиенты поддерживают SNI, но большинство из них поддерживает. Это зависит от того, как осуществляется согласование SSL, системой (тогда не работает в Win XP) или браузером (версия должна быть достаточно свежей). смотреть на список браузеров с поддержкой SNI. Если вы должны обеспечить всем клиентам доступ к вашим веб-сайтам, вы не сможете использовать SNI из-за этих старых версий (браузера или системы). Вам понадобится IP-адрес для каждого ServerName и используйте VirtualHost $ IP_alias: 443 для ServerName alias.com и VirtualHost $ IP_server: 443 для ServerName server.com вместо VirtualHost *: 443 для обоих.
Вы получаете ошибку с первым виртуальным хостом, потому что, не включив SSLEngine on
директиве Apache отправляет HTTP-ответ без SSL. Если вам нужна такая функциональность, вам придется настроить другой сайт (возможно, с другим сертификатом, если вы повторно не используете существующий домен) для вашего виртуального хоста по умолчанию, даже если все, что вы хотите сделать, это вернуть приятную ошибку.
Может, проверить, действительно ли сертификаты разные? Ваша конфигурация кажется правильной.
Также убедитесь, что нет других VirtualHost
секции, прослушивающие порт 443. Apache выберет наиболее подходящий, что означает, что если что-то более специфично для адреса, по которому пришло соединение, эта запись будет иметь приоритет. Но я не думаю, что это твоя проблема.
Кроме того, что интересно, то, что вы видите со стороны пользователя, это то, что произошло бы, если бы клиент в большинстве случаев не поддерживал SNI.