Подпуть базового местоположения NGINX, каждый с различным сертификатом и ключом TLS

Проблема: Наша реализация NGINX имеет базовое расположение для нескольких различных типов операций, например /analytics, /topology, ...; и у каждого есть свой собственный файл access_by_lua_file, который открывает взломанный токен, содержащий несколько вещей, которые должны быть проверены и обработаны, включая новый путь с правой стороны, со своим собственным сертификатом, ключом и кодом ca. Проблема, с которой мы столкнулись, заключается в том, что, похоже, нет способа подстановки переменных proxy_ssl_certificate, proxy_ssl_certificate_key и proxy_ssl_trusted_certificate, поскольку они требуют статических путей к файлам.

Вопрос: есть ли способ динамически настроить сертификат и ключ, даже если мы понизим производительность? Мы знаем о следующих ограничениях, но, честно говоря, удивлены, что в интернете пока не нашли обходного пути.

Есть две причины этого отсутствия поддержки:

  1. Nginx должен загрузить всю конфигурацию сервера SSL во время запуска, поэтому он выдает ошибку, когда сертификат или ключ не существует.
  2. Синтаксический анализатор конфигурации 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 сертификата отправлено

Другие вопросы по тегам