История изменений
Исправление spirit, (текущая версия) :
Я как-то не так понимаю использование переменных в пути к сертификату?
Судя по всему 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.
- У вас в server_name
~
перед regexp-ом не хватает. - Версия OpenSSL, c которой был собран nginx, ещё не означает, что он работает с такой. Не помешает проверить версию самой библиотеки openssl -
openssl version
Исходная версия spirit, :
Я как-то не так понимаю использование переменных в пути к сертификату?
Судя по всему 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.
- У вас в server_name
~
перед regexp-ом не хватает. - В конструкции
.*?
знак вопроса лишний. - Версия OpenSSL, c которой был собран nginx, ещё не означает, что он работает с такой. Не помешает проверить версию самой библиотеки openssl -
openssl version