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

https с двумя сертификатами sni и именами серверов, но с той же конфигурацией. я могу использовать один серверный блок?

Часто сталкиваюсь со следующей проблемой.

У меня есть сервер nginx, обслуживающий два имени хоста через https на одном IP и одном порте. У каждого имени хоста есть свой сертификат.

Пока что я делаю две конфигурации:

server {
    listen              443 ssl;
    server_name         www.example1.com;
    ssl_certificate     www.example1.com.crt;
    ssl_certificate_key www.example1.com.key;
    ssl_protocols       ...;
    ssl_ciphers         ...;
    ...
}

и

server {
    listen              443 ssl;
    server_name         www.example2.com;
    ssl_certificate     www.example2.com.crt;
    ssl_certificate_key www.example2.com.key;
    ssl_protocols       ...;
    ssl_ciphers         ...;
    ...
}

Есть ли уловка, чтобы сделать это только в одном серверном блоке?

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

На данный момент я делаю следующее:

server {
    listen              443 ssl;
    server_name         www.example1.com;
    ssl_certificate     www.example1.com.crt;
    ssl_certificate_key www.example1.com.key;
    include /etc/nginx/common_config/example1_and_2/*;
}

server {
    listen              443 ssl;
    server_name         www.example2.com;
    ssl_certificate     www.example2.com.crt;
    ssl_certificate_key www.example2.com.key;
    include /etc/nginx/common_config/example1_and_2/*;
}

Можно ли это улучшить, есть ли какие-то стандартные рекомендации? Если все в порядке, есть ли хотя бы рекомендация относительно пути к таким распространенным конфигурационным файлам?

В server_name может иметь список из нескольких имен хостов, например

server_name example.org www.example.org example.com www.example.com;

Хотя (с 1.11.0) появилась возможность загружать несколько сертификатов в один server { } block, это для нескольких различных типов (например, RSA и ECDSA), а не для нескольких имен хостов. Но можно использовать переменные в ssl_certificate:

Начиная с версии 1.15.9, переменные можно использовать в имени файла при использовании OpenSSL 1.0.2 или выше:

ssl_certificate $ssl_server_name.crt;
ssl_certificate_key $ssl_server_name.key; 

Обратите внимание, что использование переменных подразумевает, что сертификат будет загружаться для каждого подтверждения SSL, и это может отрицательно сказаться на производительности.

Из-за упомянутого влияния на производительность я бы не рекомендовал это, но я бы объединял все имена хостов для одного и того же server { } блокировать в один сертификат как Альтернативное имя субъектаs (SAN) вместо этого.