1

У меня на одном из наших серверов есть два SSL-сертификата, работающие для двух проектов, один из которых - это подстановочный SSL- код, выданный только для этого домена, который я назову domain2.com. domain1.com, другой домен имеет домен, выданный только одному поддомену, называемый серверами.

Благодаря тому, что domain2 позволяет пользователям проекта создавать субдомены, он имеет настройку VirtualHost, которая выглядит следующим образом:

<VirtualHost *:443>
    <Directory /var/www/domain2>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    #There's a SSL redirection here -
    #stackexchange network detected it as a URL shortener, so removed from question
    SSLEngine on
    SSLCertificateFile /app/domain2/certs/domain2.com.pem
    SSLCertificateKeyFile /app/domain2/certs/domain2.com.key
    SSLCertificateChainFile "/app/domain2/certs/fullchain.pem"
    SSLCACertificatePath "/app/domain2/certs/"
    SSLCACertificateFile "/app/domain2/certs/cacert.pem"
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/domain2
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Это прекрасно работает, однако servers.domain1.com SSL не работает (который выдается на letsencrypt, domain2.com выпускается с AlphaSSL

<VirtualHost servers.domain1.com:443>
    <Directory /app/corporate/mediaserver/public>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
    #There's a SSL redirection here -
    #stackexchange network detected it as a URL shortener, so removed from question
    SSLEngine on
    SSLCertificateFile /app/corporate/mediaserver/certs/[redacted]
    SSLCertificateKeyFile /app/corporate/mediaserver/certs/[redacted]
    SSLCACertificatePath /app/corporate/mediaserver/certs/[redacted]
    SSLCACertificateFile /app/corporate/mediaserver/certs/[redacted]
    ServerName servers.domain1.com
    ServerAdmin webmaster@localhost
    DocumentRoot /app/corporate/mediaserver/public
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Когда я загружаю серверы.domain1.com, он пытается загрузить SSL из подстановочного знака, однако, если я установил для <VirtualHost> значение <VirtualHost domain1.com:443> и загрузил domain1.com, он загружает SSL из правильного (server.domain1.com virtualhost просто игнорируется).

Загрузка servers.domain2.com (фактический tld .io)

1 ответ1

1

Первое: параметр в <VirtualHost …> не работает таким образом. В системах "один IP на домен" он предназначен для указания того, к какому IP-адресу будет привязан веб-сервер (то есть к какому адресу он будет получать соединения) для этого виртуального хоста. Он не предназначен для выбора виртуального хоста на основе HTTP «Host:» или TLS SNI.

Однако в комментариях вы говорите, что у вас есть только один IP-адрес (поэтому вы захотите использовать TLS SNI). В этом случае все виртуальные хост-блоки должны быть связаны с одним и тем же * адресом, а фактическое имя домена должно быть указано как ServerName .

Второе: в конфигурации Apache первый соответствующий блок VirtualHost побеждает. Если у вас есть подстановочный знак ServerName выше точных совпадений, он всегда будет выбран. Поэтому убедитесь, что ваши виртуальные хосты упорядочены правильно.

# The specific subdomains go first...

<VirtualHost *:443>
    ServerName servers.domain1.com
    DocumentRoot /app/corporate/mediaserver/public
    SSLEngine on
    SSLCertificateFile /app/corporate/mediaserver/certs/fullchain.pem
    SSLCertificateKeyFile /app/corporate/mediaserver/certs/privkey.pem
</VirtualHost>

# ...and the wildcard is last:

<VirtualHost *:443>
    ServerName domain1.com
    ServerAlias *.domain1.com
    DocumentRoot /var/www/domain2
    SSLEngine on
    SSLCertificateFile /app/domain2/certs/fullchain.pem
    SSLCertificateKeyFile /app/domain2/certs/domain2.com.key
</VirtualHost>

(Настройка SSLCertificateChainFile устарела в Apache 2.4. Настройки SSLCA* предназначены для аутентификации клиента - если вы ее не используете, они вам тоже не нужны.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .