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

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

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

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

  1. Nginx необходимо загрузить всю конфигурацию SSL-сервера во время запуска, поэтому он выдает ошибку, когда сертификат или ключ не существует.
  2. Анализатор конфигурации Nginx SSL не расширяет пользовательские переменные, поэтому ему нужен относительный или абсолютный путь.

person doktoroblivion    schedule 05.03.2018    source источник
comment
Взгляните на github.com/openresty/ и github.com/openresty/lua-resty-core/blob/master /lib/ngx/ssl.md   -  person Alexander Altshuler    schedule 06.03.2018
comment
@AlexanderAltshuler, так что я действительно нашел оба из них и ввел их вместе с ssl_clear_certs в код lua и получил это, что, я думаю, демонстрирует, что это не работает. игнорирование устаревшей глобальной ошибки SSL (SSL: ошибка: 0D0680A8: процедуры кодирования asn1: ASN1_CHECK_TLEN: ошибка неправильного тега: 0D08303A: процедуры кодирования asn1: ASN1_TEMPLATE_NOEXP_D2I: вложенная ошибка ошибки asn1: 0D0680A8: процедуры кодирования asn1: ASN1_CHECK_TLEN: ошибка неправильного тега: AD: 07103 подпрограммы кодирования: ASN1_ITEM_EX_D2I: вложенная ошибка asn1: тип = ошибка RSA: 04093004: подпрограммы rsa: OLD_RSA_PRIV_DECODE: RSA lib ...   -  person doktoroblivion    schedule 06.03.2018


Ответы (2)


Ниже приведена последовательность вызовов SSL API, которые я использую в одном из своих модулей 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

person Alexander Altshuler    schedule 06.03.2018
comment
Можете ли вы сказать мне, удалены ли файлы PEM CRLF, у меня они все еще есть, но API никогда не выдают ошибку. После того, как я сделал именно то, что вы видите там в LUA, я возвращаюсь к nginx, и следующим оператором является вызов proxy_pass, который выдает 400 в моем браузере, так что, возможно, это что-то на стороне браузера? - person doktoroblivion; 06.03.2018
comment
@ErickGriffin Ваш код (в вашем ответе) пропускает вызов set_der_priv_key(). Последовательность из моего ответа работает для меня. Я использовал файлы pem, созданные утилитой openssl. - person Alexander Altshuler; 06.03.2018
comment
set_der_priv_key есть. Что я не упомянул, так это то, что переменные в каждом из них, поскольку в документации не указано контекста, фактически содержат содержимое PEM в виде строки, это не строка, содержащая имя файла, а фактическое значение PEM. Например, key = -----BEGIN RSA PRIVATE KEY-----..., не уверен, что это нормально, но ошибки там не возникает. - person doktoroblivion; 07.03.2018
comment
Я думаю, что наконец-то заставил его работать, в файле conf отсутствовал proxy_ssl_server_name, не знаю, почему это выдало мне эту странную ошибку. Теперь я борюсь с сообщением 400 Bad Request - Ошибка SSL-сертификата. - person doktoroblivion; 07.03.2018

Предлагаемый ответ на эту проблему не работает. Вот код:

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-сертификат

person doktoroblivion    schedule 06.03.2018
comment
Должен ли я использовать parse_pem_cert, parse_priv_key и set_cert, set_key для каждого вместо вышеуказанного? Собираюсь попробовать это вместо этого. - person doktoroblivion; 06.03.2018