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

Apache SNI, 2 домена, 2 сертификата, разрешает один и тот же корень документа

В настоящее время я следую следующему руководству: https://www.digitalocean.com/community/articles/how-to-set-up-multiple-ssl-certificates-on-one-ip-with-apache-on-ubuntu-12-04

До сих пор установка прошла без проблем. Я использую два сертификата класса 1, которые я зарегистрировал в http://www.startssl.com/?app=21. Каждый отображается в свой (правильный) домен.

Проблема в следующем: переход к любому домену под https разрешает один и тот же корень документа, т.е. если я перейду к https://backend.domain2.com, Я правильно захожу в корень документа, указанный в его конфигурации VirtualHost. Однако, если я пойду в https://email.domain1.com, Меня отправляют в корень backend.domain2, URL-адрес остается неизменным, с предупреждением о том, что сертификат SSL недействителен. Проверка «недействительного» сертификата показывает, что это тот, который подключен к backend.domain2.

Что я здесь делаю не так? ниже приведены конфигурации VirtualHost для обоих доменов:

<IfModule mod_ssl.c>
        <VirtualHost *:443>
        # The ServerName directive sets the request scheme, hostname and port that
        # the server uses to identify itself. This is used when creating
        # redirection URLs. In the context of virtual hosts, the ServerName
        # specifies what hostname must appear in the request's Host: header to
        # match this virtual host. For the default virtual host (this file) this
        # value is not decisive as it is used as a last resort host regardless.
        # However, you must set it for any further virtual host explicitly.

        ServerName mail.domain1.se
        ServerAdmin christopher.svanefalk@gmail.com
        ServerAlias www.mail.domain1.se

        DocumentRoot /usr/share/apache2/roundcubemail

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>

    SSLEngine on
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

    SSLCertificateFile      /etc/ssl/certs/domain1.crt
        SSLCertificateKeyFile   /etc/ssl/private/domain1.key
    #SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        # For most configuration files from conf-available/, which are
        # enabled or disabled at a global level, it is possible to
        # include a line for only one particular virtual host. For example the
        # following line enables the CGI configuration for this host only
        # after it has been globally disabled with "a2disconf".
        #Include conf-available/serve-cgi-bin.conf

        #Alias /mail "/usr/share/apache2/roundcubemail/"

        ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/usr/share/apache2/roundcubemail/$1

    </VirtualHost>
</IfModule>



<IfModule mod_ssl.c>
<VirtualHost *:443>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.

    ServerName backend.domain2.com
    ServerAdmin christopher.svanefalk@gmail.com
    #ServerAlias www.domain2.com

    DocumentRoot /var/www/backend.domain2.com/html

    <Directory />
            Options FollowSymLinks
            AllowOverride None
        </Directory>

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf

    #Alias /mail "/usr/share/apache2/roundcubemail/"

    #ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/pegasusgbg.se/html/$1

    SSLEngine On
    SSLProtocol all -SSLv2
    SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM

    SSLCertificateFile /etc/ssl/certs/domain2.crt
    SSLCertificateKeyFile /etc/ssl/private/domain2.key
    #SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem
    CustomLog /var/log/apache2/ssl_request_log \
        "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>
</IfModule>

Моя конфигурация ports.conf:

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default

NameVirtualHost *:80
NameVirtualHost *:443

Listen 80

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

Это..

ServerName mail.domain1.se
ServerAdmin christopher.svanefalk@gmail.com
ServerAlias www.mail.domain1.se

..и это..

ServerName backend.domain2.com
#ServerAlias www.domain2.com

... оба не совпадают с именем хоста, который вы, по вашему мнению, посещаете, https://domain1.com. Эти имена хостов должны точно совпадать с тем, что запрашивается в браузере, чтобы клиент мог предоставить правильный сертификат.

Просто чтобы убедиться, используете ли вы версию браузера, поддерживающую SNI? Согласно Википедии,

 As of November 2012, the only major user bases whose browsers do not support 
 SNI appear to be users of Android 2.x (default browser)[2], Internet Explorer 
 on Windows XP[3][4] and versions of Java before 1.7 on any operating system.[5]

или более подробный список здесь: http://en.wikipedia.org/wiki/Server_Name_Indication#Client_side