LINUX.ORG.RU

История изменений

Исправление spirit, (текущая версия) :

Имя из сертификата можно узнать только прочитав сертификат

Зачем нужно узнавать имя из сертификата ?
nginx отдаёт клиенту любой сертификат, который указан в соответствующем vhost-е (директива server {...}), вне зависимости от имён в сертификате.

Исходная версия spirit, :

Имя из сертификата можно узнать только прочитав сертификат

Зачем нужно узнавать имя из сертификата ?
nginx отдаёт клиенту любой сертификат, который указан в соответствующем vhost-е (директива server {...}), вне зависимости от имён в сертификате.

Я как-то не так понимаю использование переменных в пути к сертификату?

Судя по всему nginx не сразу выставляет значение всех переменных, когда нам кажется, что должен бы. В момент работы модуля ssl, он выставляет свой набор переменных. Именно поэтому в примерах из документации nginx используется $ssl_server_name. Ваша $basename на этот момент ещё пустая, поэтому магия не случается. Победить ситуацию можно с помощью директивы map. Такой вариант проверил у себя - 100% рабочий:

map $ssl_server_name $basename {
    default          default;
    ~^.*\.(.*)$      $1;
}

server {
    listen 443 ssl;

    # server_name ...;

    ssl_certificate     ssl/test/$basename-cert.pem;
    ssl_certificate_key ssl/test/$basename-key.pem;
}

Для теста сгенерировал 3 пары cert/key - default, test1 и test2. Важно: сертификаты/ключи должны иметь права, позволяющие их читать пользователю, из-под которого работают worker-ы nginx. Проверка:

$ for domain in domain-without-dot test1 test2 aa.test1 x.y.z.test2; do echo -ne "$domain\t"; openssl s_client -connect 127.0.0.1:443 -servername $domain < /dev/null 2> /dev/null | openssl x509 -subject -noout; done | column -t

domain-without-dot  subject=CN  =  default
test1               subject=CN  =  default
test2               subject=CN  =  default
aa.test1            subject=CN  =  test1
x.y.z.test2         subject=CN  =  test2

P.S.

  1. У вас в server_name ~ перед regexp-ом не хватает.
  2. В конструкции .*? знак вопроса лишний.
  3. Версия OpenSSL, c которой был собран nginx, ещё не означает, что он работает с такой. Не помешает проверить версию самой библиотеки openssl - openssl version