Установите клиентские переменные ssl cert как заголовки запроса сообщения в openresty - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать роутер для внутреннего тестирования.Я использую изображение под открытым небом 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-variableпохоже, он делает именно то, что мы хотим: 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. Другое?

1 Ответ

0 голосов
/ 25 мая 2018

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

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

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
...