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

我的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实用程序包含在所有图像中,高山和Windows除外。这与我的问题有任何关系吗?

如果仅添加config选项不起作用,您认为哪个是最佳选择?


使用nginx-ssl-variables看起来确实像我们想要的那样:https://github.com/Seb35/nginx-ssl-variables
修改openresty代码以构建我们自己的映像,该映像增强了ngx.ocsp模块,以使证书可作为ngx.var.ssl_client_raw_cert in rewrite_by_lua_block使用
修改openresty代码以构建我们自己的覆盖SSL握手的映像
以上的一些组合
其他?

最佳答案

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安装该模块的最简单方法是将其包含在Dockerfile中(从具有luarocks support的映像构建):

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

10-06 16:14