Назад | Перейти на главную страницу

Apache SNI namevhosts всегда направляет к первой записи 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)

Обновить

Так что по какой-то странной причине проблема, похоже, разрешилась сама собой.
Возможно, это какая-то странная проблема с кешированием или что-то в этом роде (хотя у меня apache2ctl stop/start/restart и sudo service apache2 stop/start/restart/reloaded много раз и выполнили тесты локально на сервере, а также на нескольких разных машинах).

Не стесняйтесь снять этот вопрос или оставить его, если он служит какой-либо справкой.
Спасибо за всю помощь, ребята!

Ваша конфигурация выглядит нормально; Включена директива 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.