Подпуть базового местоположения NGINX, каждый с различным сертификатом и ключом TLS
Проблема: Наша реализация NGINX имеет базовое расположение для нескольких различных типов операций, например /analytics, /topology, ...; и у каждого есть свой собственный файл access_by_lua_file, который открывает взломанный токен, содержащий несколько вещей, которые должны быть проверены и обработаны, включая новый путь с правой стороны, со своим собственным сертификатом, ключом и кодом ca. Проблема, с которой мы столкнулись, заключается в том, что, похоже, нет способа подстановки переменных proxy_ssl_certificate, proxy_ssl_certificate_key и proxy_ssl_trusted_certificate, поскольку они требуют статических путей к файлам.
Вопрос: есть ли способ динамически настроить сертификат и ключ, даже если мы понизим производительность? Мы знаем о следующих ограничениях, но, честно говоря, удивлены, что в интернете пока не нашли обходного пути.
Есть две причины этого отсутствия поддержки:
- Nginx должен загрузить всю конфигурацию сервера SSL во время запуска, поэтому он выдает ошибку, когда сертификат или ключ не существует.
- Синтаксический анализатор конфигурации Nginx SSL не раскрывает пользовательские переменные, поэтому ему нужен относительный или абсолютный путь.
2 ответа
Ниже приведена последовательность вызовов API SSL, которые я использую в одном из моих модулей OpenResty.
ssl.clear_certs()
ssl.cert_pem_to_der()
ssl.set_der_cert()
ssl.priv_key_pem_to_der()
ssl.set_der_priv_key()
На самом деле это точно так же, как на https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md#synopsis
Предложенный ответ на эту проблему не работает. Вот код:
if cert ~= nil and key ~= nil then
-- clear the fallback certificates and private keys that are statically
-- set by the ssl_certificate and ssl_certificate_key in proxy.conf
-- directives
ngx.log(ngx.DEBUG, 'Clearing fallback certificates');
local ok, err = ssl.clear_certs()
if not ok then
ngx.log(ngx.ERR, "failed to clear existing (fallback) certificates")
return ngx.exit(ngx.ERROR)
end
ngx.log(ngx.DEBUG, 'Convert private key pem to DER format');
-- key already contains the private key as provided in token
local client_key, err = ssl.priv_key_pem_to_der(key);
if not client_key then
ngx.log(ngx.ERR, "failed to convert PEM priv key to DER: ", err)
return
end
ngx.log(ngx.DEBUG, 'Set private key DER');
ok, err = ssl.set_der_priv_key(client_key)
if not ok then
ngx.log(ngx.ERR, "failed to set DER priv key: ", err)
return
end
ngx.log(ngx.DEBUG, 'Convert certificate pem to DER format');
-- cert already contains the private key as provided in token
local client_cert, err = ssl.cert_pem_to_der(cert);
if not client_cert then
ngx.log(ngx.ERR, "failed to convert PEM cert to DER: ", err)
return
end
ngx.log(ngx.DEBUG, 'Set certificate DER');
ok, err = ssl.set_der_cert(client_cert)
if not ok then
ngx.log(ngx.ERR, "failed to set DER cert: ", err)
return
end
end
ngx.log(ngx.INFO, 'Passing request to: ', ngx.var.target)
Выход:
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:270: Clearing fallback certificates
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:277: Convert private key pem to DER format
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:285: Set private key DER
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:292: Convert certificate pem to DER format
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:300: Set certificate DER
2018/03/06 13:55:31 [info] 31#0: *12 [lua] analytics_access.lua:309: Passing request to: https://blah blah...
А на консоли:400 Bad Request Нет обязательного SSL сертификата отправлено