将客户端 ssl 证书变量设置为 openresty 中消息的请求 headers

Set client ssl cert variables as request headers of the message in openresty

我正在尝试创建一个用于内部测试的路由器。我正在使用 openresty 图片 RESTY_CONFIG_OPTIONS_MORE。由于我们从客户端发送的消息是二进制的并且没有任何请求 headers,我们试图从证书中提取颁发者和序列号并将它们设置为请求 headers。 我们希望使用这些 header 路由到我们的测试服务器,而不是根据 header 值路由到生产服务器。

我的 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. 其他?

ngx_http_ssl_module 默认安装在官方 OpenResty docker 镜像中。 你不需要关心 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 the simplest way to install that module is to include into your Dockerfile (built from an image with luarocks support):

RUN luarocks install openssl --server=https://rocks.moonscript.org/dev