【问题标题】:Set client ssl cert variables as request headers of the message in openresty将客户端 ssl 证书变量设置为 openresty 中消息的请求标头
【发布时间】:2018-11-01 19:23:24
【问题描述】:

我正在尝试创建一个用于内部测试的路由器。我正在使用 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. 其他?

【问题讨论】:

  • “由于我们从客户端发送的消息是二进制的并且没有任何请求标头,” 那么听起来您正在混合 HTTP 和.. . 不是 HTTP。 HTTP 需要一组最少的请求标头。

标签: ssl nginx lua ssl-certificate openresty


【解决方案1】:

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

【讨论】:

  • 非常感谢。我在这里与安装作斗争:stackoverflow.com/questions/50519633/…
  • 我收到You may have to install OPENSSL in your system and/or pass OPENSSL_DIR or OPENSSL_INCDIR to the luarocks command.
  • 当我指定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
猜你喜欢
  • 2012-06-28
  • 2013-07-08
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-02-19
  • 1970-01-01
相关资源
最近更新 更多