将客户端 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. 其他?
点赞
用户2060502
用户2060502

默认情况下,官方的 OpenResty docker 镜像已经安装了 ngx_http_ssl_module 模块。您无需关心 RESTY_CONFIG_OPTIONS_MORE。

我认为最好的解决方案是使用 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。我认为安装这个模块最简单的方法是在您的 Dockerfile 中包含它(从支持 luarocks 支持 的镜像构建):

RUN luarocks install openssl --server=https://rocks.moonscript.org/dev
2018-05-25 09:04:30