Имена хостов Apache SNI всегда направляются к первой записи VirtualHost
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)
4 ответа
Обновить
Так что по какой-то странной причине проблема, похоже, решилась сама собой.
Возможно, это какая-то странная проблема с кэшированием или что-то подобное (хотя у меня есть apache2ctl stop/start/restart
а также sudo service apache2 stop/start/restart/reload
редактировал много раз и проводил тесты локально на сервере, а также на нескольких разных машинах).
Не стесняйтесь снять этот вопрос или оставить его, если он служит какой-либо ссылкой.
Спасибо за всю помощь, ребята!
Ваша конфигурация выглядит хорошо; Директива 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.
Мы потратили все утро на устранение связанной с этим проблемы в Oracle Linux 8 (так же, как RHEL8 / Alma 8 / Rocky 8 / и т. д.). Вероятно, такое поведение существует и в других дистрибутивах.
Если имя хоста вашего сервера (т. е.) совпадает с именем сервера или ServerAlias в разделе <VirtualHost>, тогда основные разделы сервера будут отображаться вместо DocumentRoot, указанного в VirtualHost. Из-за этого настройки SSL и DocumentRoot в разделе <VirtualHost> будут игнорироваться!По той же причине он также будет загружать файлы из /var/www/html/* вместо определения <VirtualHost>.
Исправление состоит в том, чтобы определить