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

Два домена, два сертификата SSL, один IP

Я пытаюсь запустить два домена, один с подстановочным сертификатом, а другой с обычным сертификатом с одного IP-адреса и одного nginx.

Настройка: example1.com с подстановочным сертификатом example2.com с обычным сертификатом

Моя текущая конфигурация nginx для моей установки с подстановочными знаками выглядит так (я еще не начал добавлять второй домен):

/etc/nginx/sites-available/example1.com:

server {
    listen  443 default_server ssl;
    server_name         _;

    ssl_certificate     /etc/nginx/ssl/example1.com/example1.com.crt;
    ssl_certificate_key /etc/nginx/ssl/example1.com/example1.com.key;

    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;

    # Perfect Forward Security
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";
}

server {
    listen      443;
    server_name example1.com;

    error_log   /var/log/nginx/example1.com.error.ssl.log;
    access_log  /var/log/nginx/example1.com.access.ssl.log;

    root /var/www/example1.com/;
    index index.html;
}

server {
    listen      80;
    server_name example1.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

Теперь у меня также есть несколько поддоменов, поэтому я использую групповой сертификат. Конфиги поддоменов выглядят так:

/etc/nginx/sites-available/sub1.example1.com

server {
    listen      443;
    server_name sub1.example1.com;

    error_log   /var/log/nginx/sub1.example1.com.error.ssl.log;
    access_log  /var/log/nginx/sub1.example1.com.access.ssl.log;

    root /var/www/sub1.example1.com/;

    location / {
        # nothing
    }
}

server {
    listen      80;
    server_name sub1.example1.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}

Эта настройка довольно удобна, потому что все поддомены наследуют настройки ssl из example.com config, потому что это default_server.

Как лучше всего добавить второй домен сейчас? Если я просто добавлю домен таким же образом, я, очевидно, получу ошибку при запуске, потому что есть дубликат default_server вход. Если я удалю default_server вход из example2.comконфигурации он вернется к конфигурации ssl из example1.com.

Чего хочу, но не знаю, как добиться:

Имейте по одной «основной» конфигурации для каждого домена, назовем ее example1.com-default и example2.com-default.

Эти конфигурации должны включать все настройки, общие для разных субдоменов, такие как конфигурация SSL, Perfect Forward Security, ... и разные субдомены будут просто меньшими конфигурациями, которые наследуют эти настройки от своего соответствующего основного домена.

Так sub1.example1.com унаследует настройки SSL от example1.com-default и sub1.example2.com унаследует настройки SSL от example2.com-default.

Возможно ли это, и если да, то как мне этого добиться?

Заранее спасибо!

Если вы имеете в виду другие настройки SSL, кроме сертификата / ключа, я бы посоветовал вам переместить их конфигурацию в http уровень в конфигурации nginx.

Таким образом, настройки будут унаследованы каждому server блок.

Например, в Debian и производных вы можете создать /etc/nginx/conf.d/ssl.conf файл, куда вы помещаете эти строки:

ssl_session_cache    shared:SSL:10m;
ssl_session_timeout  10m;

# Perfect Forward Security
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

Файлы внутри conf.d включены в http уровень.

default_server подход здесь не работает.

После этого server блоки будут выглядеть так:

server {
    listen 443 default_server ssl;
    server_name _;

    ssl_certificate /path/to/certificate;
    ssl_certificate_key /path/to/key;
}

И, если вы хотите переопределить некоторые настройки для некоторых доменов, вы можете повторно ввести директивы в server уровень.

Это вызвано поведением протокола SSL. SSL-соединение устанавливается до того, как браузер отправит HTTP-запрос, а nginx не знает имя запрошенного сервера. Следовательно, он может предлагать только сертификат сервера по умолчанию.

Вы можете прочитать эту статью, в конце у вас есть несколько вариантов, используя несколько доменов на одном сервере, множество IP-адресов в качестве сертификатов или SNI (Server_Name_Indication):

Настройка Https серверов, NGINX DOC