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

Один IP-адрес и подстановочный сертификат для нескольких виртуальных хостов (Windows, Apache 2.4.2, OpenSSL 1.0.2e)

Я искал и искал, но не могу найти решение своей проблемы, поэтому извиняюсь, если это звучит знакомо, но я в растерянности.

У меня есть:

Мне нужно использовать подстановочный сертификат для всех моих виртуальных хостов.

Я протестировал сайт / сертификат с помощью openssl, и он подтвердил, что все в порядке.

Все сайты нормально работают при использовании стандартного http через порт 80.

Когда я включаю httpd-ssl.conf, у меня начинаются проблемы.

Я видел и пробовал несколько примеров конфигураций http-ssl.conf, но все они приводили к периодическим сбоям соединения, например Firefox: "Безопасное соединение не удалось", IE11:"Эта страница не может быть отображена". тем не мение, если я обновлю страницу (в каждом браузере), отобразится страница, и я увижу, что сертификат действителен.

Из того, что я прочитал, это указывает на неправильную конфигурацию http-ssl.conf, но я пробовал генератор конфигурации Mozilla SSL (https://mozilla.github.io/server-side-tls/ssl-config-generator/), много ответов stackoverflow, но все равно без радости.

Это мой текущий файл httpd-ssl.conf:

Listen  443 https

SSLStrictSNIVHostCheck off

SSLPassPhraseDialog builtin
SSLSessionCache     "shmcb:C:/Apache2.4/logs/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLProtocol         All -SSLv2 -SSLv3 
SSLCipherSuite      ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS

<VirtualHost 127.0.0.1:443>
    ServerName  www.site.co.uk
    ServerAlias www.site.co.uk
    DocumentRoot    C:\WebServer\Apache2.4\htdocs\www.site.co.uk

    SSLEngine On
    SSLCertificateFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.crt"
    SSLCertificateKeyFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.key"
    SSLCertificateChainFile "C:\WebServer\Apache2.4\conf\extra\ssl\site_wildcard.ca-bundle"
    SSLCACertificateFile "C:\WebServer\Apache2.4\conf\extra\ssl\addtrustexternalcaroot.crt"
</VirtualHost>

<VirtualHost 127.0.0.1:443>
    ServerName  sub.site.co.uk
    ServerAlias sub.site.co.uk
    DocumentRoot    C:\WebServer\Apache2.4\htdocs\sub.site.co.uk
</VirtualHost>

После длительного тестирования мой первоначальный комментарий не решил проблему.

Сертификат настроен правильно.

При запуске тестов на таких веб-сайтах, как ssllabs.com, результаты протокола и рукопожатия будут случайным образом отличаться, даже если не произошло никаких изменений конфигурации.

Тестирование / проверка с помощью OpenSSL время от времени давало правильный результат, но в большинстве случаев приводило к:

ssl-рукопожатие не удалось

Оказывается, виновником было то, что у меня было это в моем файле httpd.conf:

AcceptFilter https none

Прокомментировав это, он решил проблему:

#AcceptFilter https none

когда я правильно интерпретирую конфигурацию, вы устанавливаете свои V-Hosts на локальный интерфейс. Если вы хотите правильно обслуживать страницы, вам необходимо настроить хосты на доступные IP-адреса:

<VirtualHost 0.0.0.0:443>
ServerName  www.site.co.uk
ServerAlias www.site.co.uk
...
</VirtualHost>

или к IP-адресу вашего сервера (например, 192.168.23.4)

<VirtualHost 192.168.23.4:443>
ServerName  www.site.co.uk
ServerAlias www.site.co.uk
...
</VirtualHost>

Возможно, это решит ваши проблемы.

Обновить: Моя конфигурация выглядит так (система Linux)

<IfModule mod_ssl.c>
<VirtualHost *:443>
        ServerAdmin     admin@foo.bar
        ServerName      www.foo.bar.com
        ServerAlias     foo.bar.com
        DocumentRoot    /var/www/foo
        SSLEngine on
        SSLProtocol TLSv1
        SSLHonorCipherOrder On
        SSLCipherSuite RC4-SHA:HIGH:!ADH

        SSLCertificateChainFile         /etc/apache2/ssl/2015/intermediate.crt
        SSLCertificateFile              /etc/apache2/ssl/2015/public.crt
        SSLCertificateKeyFile           /etc/apache2/ssl/private.open.key
</VirtualHost>
<VirtualHost *:443>
        ServerAdmin admin@bar.com
        ServerName      www.bar.com
        ServerAlias     bar.com
        DocumentRoot /var/www/bar

        SSLEngine on
        SSLProtocol TLSv1
        SSLHonorCipherOrder On
        SSLCipherSuite RC4-SHA:HIGH:!ADH

        SSLCertificateChainFile         /etc/apache2/ssl/2015/intermediate.crt
        SSLCertificateFile              /etc/apache2/ssl/2015/public.crt
        SSLCertificateKeyFile           /etc/apache2/ssl/private.open.key

...
</VirtualHost>
</IfModule>