Установите переменные сертификата ssl клиента в качестве заголовков запроса сообщения в openresty

Я пытаюсь создать маршрутизатор для внутреннего тестирования. Я использую образ openresty RESTY_CONFIG_OPTIONS_MORE. Поскольку сообщения, которые мы отправляем от клиента, являются двоичными и не имеют заголовков запроса, мы пытаемся извлечь эмитента и серийный номер из сертификата и установить их в качестве заголовков запроса. Мы хотим использовать эти заголовки для маршрутизации на наш тестовый сервер, а не на рабочий, в зависимости от значений заголовков.

Мой dockerfile захватывает его так:

ENV RESTY_CONFIG_OPTIONS_MORE "--with-ngx_http_ssl_module"

Я уже пробовал следующее в блоке сервера, но это не сработало:

rewrite_by_lua_block {
        ngx.req.set_header("x-issuer", ngx.var.ssl_client_i_dn)
    }

Автор упомянул, что утилита envsubst включена во все образы, кроме alpine и windows. Это как-то относится к моему вопросу?

Если простое добавление параметров конфигурации не сработает, какой вариант вы считаете лучшим?

  1. Использование nginx-ssl-variables выглядит так, как будто оно делает именно то, что нам нужно: https://github.com/Seb35/nginx-ssl-variables
  2. Измените код openresty, чтобы создать собственный образ, улучшающий модуль ngx.ocsp, чтобы сделать сертификат доступным как ngx.var.ssl_client_raw_cert in rewrite_by_lua_block.
  3. Измените код openresty, чтобы создать собственный образ, перезаписывающий рукопожатие SSL.
  4. Некоторая комбинация вышеперечисленного
  5. Другой?

person PeggyScott    schedule 22.05.2018    source источник
comment
Поскольку сообщения, которые мы отправляем от клиента, являются двоичными и не имеют заголовков запроса, то это звучит так, как будто вы смешиваете концепции HTTP и... не HTTP. HTTP требует минимального набора заголовков запроса.   -  person Michael - sqlbot    schedule 23.05.2018


Ответы (1)


ngx_http_ssl_module по умолчанию установлен в официальном образе докера OpenResty. Вам не нужно заботиться о RESTY_CONFIG_OPTIONS_MORE.

IMO лучшим решением будет использование nginx-ssl-variables в качестве эталонной реализации и установки переменных вам нужно, например:

set_by_lua_block $ssl_client_issuer {
        if ngx.var.https == "on" then
            return require("openssl").x509.read(ngx.var.ssl_client_raw_cert):issuer():oneline()
        end
        return nil
}

Вам нужно будет установить lua-openssl. IMO, самый простой способ установить этот модуль — включить его в свой Dockerfile (созданный из образа с поддержкой luarocks). ):

RUN luarocks install openssl --server=https://rocks.moonscript.org/dev
person Alexander Altshuler    schedule 25.05.2018
comment
я получаю You may have to install OPENSSL in your system and/or pass OPENSSL_DIR or OPENSSL_INCDIR to the luarocks command. - person Martynas Jusevičius; 03.02.2021
comment
И когда я указываю OPENSSL_DIR (RUN luarocks install openssl OPENSSL_DIR=/usr/bin/openssl), я получаю Error: Could not find header file for OPENSSL No file openssl/evp.h in /usr/bin/openssl/include. - person Martynas Jusevičius; 03.02.2021