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

Канонический хост Apache с одним сертификатом SSL для с www. и без

Используя SNI, существует несколько доменов со своими собственными сертификатами SSL (LetsEncrypt) на одном IP-адресе. Для одного из основных доменов давайте просто скажем https: //thedomain.tld, посещение https: //www.thedomain.tld приводит к ошибке браузера (неправильное соответствие сертификата SSL) вместо того, чтобы либо обслуживать контент для www.thedomain.tld, либо перенаправлять. Я пробовал это разными способами. Пример:

<IfModule mod_ssl.c>
  <VirtualHost 0.0.0.1:443>
    ServerName              domain.tld
    ServerAlias             www.domain.tld

    DocumentRoot            /var/www/domain.tld/
    ...

    SSLEngine               on
    SSLCertificateFile      /etc/letsencrypt/live/domain.tld/cert.pem
    ...

    <Directory /var/www/domain.tld>
            Options         -ExecCGI -Indexes -Includes +FollowSymLinks
            AllowOverride   FileInfo AuthConfig

            RewriteEngine   on
            RewriteBase     /
            RewriteCond     %{HTTP_HOST} ^www\.(.*)$ [NC]
            RewriteRule     ^/(.*)$ https://%1/$1 [R=301,L]
    ...

Версия: Apache 2.4.18

Боковое примечание: один сервер, это отлично работает (выделенный Ubuntu 16.04). С другой стороны (Amazon Ubuntu 16.04) его способность перенаправлять или ссылаться или что-то еще с www и без него не существует.

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

www. является авторитетным для этого сайта, поэтому вот что я сделал:

  • выдать еще один сертификат для domain.tld
  • бланкетное перенаправление https: //domain.tld к https: //www.domain.tld

    <VirtualHost *:443>
        ServerName              domain.tld
        DocumentRoot            /var/www/domain.tld
    
        SSLEngine               on
        SSLCertificateFile      /etc/letsencrypt/live/domain.tld/cert.pem
    ...
    
        RedirectMatch           301 (.*) https://www.domain.tld$1
    </VirtualHost>
    <VirtualHost *:443>
        ServerName              www.domain.tld
    ...
    

Перво-наперво, если вы обслуживаете http: //www.thedomain.tld вообще, я бы подумал о перенаправлении его на https: //thedomain.tld. Это решает проблему для пользователей, вводящих www.thedomain.tld в своем браузере (но не решает ее для пользователей, которые вводят https: или уже имеют ссылки / закладки https или вынуждены переходить на https браузерами / HSTS).

Если вы не обслуживаете простой http, то, к сожалению, вам либо нужен сертификат, содержащий либо www.thedomain.tld, либо * .thedomain.tld в поле сертификата SAN (или поле CN, если SAN отсутствует).

Невозможно обойти это с помощью всего, что производит Apache. Первое, что получает браузер после TCP-соединения, - это сертификат. Если SAN / CN не соответствует точно тому имени хоста, которое хочет браузер, игра окончена. Браузер отображает предупреждение и даже не отправляет HTTP-запрос, поэтому Apache никогда не отвечает.

Редирект все равно не бывает.

Если вы получаете сертификат www.thedomain.tld отдельно от сертификата domain.tld, вам необходимо поместить отдельное имя сервера в отдельный виртуальный хост Apache. Но это создает проблемы с обслуживанием.

Я бы рекомендовал один сертификат (поле SAN может содержать много имен), и тогда конфигурация ServerName + ServerAlias ​​будет работать так, как вы указали.