【问题标题】:NGINX base location sub-paths each with different TLS certificate and keyNGINX 基本位置子路径,每个子路径都有不同的 TLS 证书和密钥
【发布时间】:2018-03-07 00:18:29
【问题描述】:

问题:我们的 NGINX 实现有一个用于几种不同操作类型的基本位置,例如/分析,/拓扑,...;每个都有自己的 access_by_lua_file,它会打开一个传入的令牌,其中包含必须验证和处理的一些内容,包括一个新的右侧路径,并带有自己的证书、密钥和 ca。我们遇到的问题是似乎没有办法对 proxy_ssl_certificateproxy_ssl_certificate_keyproxy_ssl_trusted_certificate 变量进行通配符,因为它们需要静态文件路径。

问题:有没有办法动态配置证书和密钥,即使我们受到性能影响?我们知道以下限制,但坦率地说,互联网上尚未出现任何解决方法。

缺乏支持有两个原因:

  1. Nginx 需要在启动时加载整个 SSL 服务器配置 时间,因此当证书或密钥不存在时会引发错误 存在。
  2. Nginx SSL 配置解析器不扩展用户定义 变量,所以它需要一个相对或绝对路径。

【问题讨论】:

  • @AlexanderAltshuler 所以我实际上找到了这两个并将它们与 ssl_clear_certs 一起注入到 lua 代码中并收到了这个,我认为这表明它不起作用。忽略过时的全局 SSL 错误(SSL:错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TLEN:错误标记错误:0D08303A:asn1 编码例程:ASN1_TEMPLATE_NOEXP_D2I:嵌套 asn1 错误错误:0D0680A8:asn1 编码例程:ASN1_CHECK_TLEN:错误标记错误:0D07803A:编码例程:ASN1_ITEM_EX_D2I:nested asn1 error:Type=RSA error:04093004:rsa routines:OLD_RSA_PRIV_DECODE:RSA lib ...

标签: nginx lua openresty


【解决方案1】:

以下是我在一个 OpenResty 模块中使用的一系列 SSL API 调用。

ssl.clear_certs()
ssl.cert_pem_to_der()
ssl.set_der_cert()
ssl.priv_key_pem_to_der()
ssl.set_der_priv_key()

其实和https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md#synopsis上的一模一样

【讨论】:

  • 你能告诉我 PEM 文件是否删除了 CRLF,我的仍然有它们,但 API 从不抛出错误。在我完成了你在 LUA 中显示的内容之后,我返回到 nginx,下一个语句是 proxy_pass 调用,它在我的浏览器中抛出 400,所以也许它在浏览器端?
  • @ErickGriffin 您的代码(在您的回答中)错过了 set_der_priv_key() 调用。我回答的顺序对我有用。我使用了由 openssl 实用程序生成的 pem 文件。
  • set_der_priv_key 在那里。我没有提到的是,每个变量中的变量,因为文档说“无上下文”,实际上包含 PEM 内容作为字符串,它不是包含文件名称的字符串,而是实际 PEM 值。例如key = "-----BEGIN RSA PRIVATE KEY-----...",不确定是否OK,但不会抛出错误。
  • 我想我终于让它工作了,在 conf 文件中缺少 proxy_ssl_server_name,不知道为什么这会给我这个奇怪的错误。现在我正在与消息“400 Bad Request - SSL 证书错误”作斗争
【解决方案2】:

对这个问题的建议答案似乎不起作用。代码如下:

if cert ~= nil and key ~= nil then

    -- clear the fallback certificates and private keys that are statically
    -- set by the ssl_certificate and ssl_certificate_key in proxy.conf
    -- directives
    ngx.log(ngx.DEBUG, 'Clearing fallback certificates');
    local ok, err = ssl.clear_certs()
    if not ok then
        ngx.log(ngx.ERR, "failed to clear existing (fallback) certificates")
        return ngx.exit(ngx.ERROR)
    end

    ngx.log(ngx.DEBUG, 'Convert private key pem to DER format');
    -- key already contains the private key as provided in token
    local client_key, err = ssl.priv_key_pem_to_der(key);
    if not client_key then
        ngx.log(ngx.ERR, "failed to convert PEM priv key to DER: ", err)
        return
    end

    ngx.log(ngx.DEBUG, 'Set private key DER');
    ok, err = ssl.set_der_priv_key(client_key)
    if not ok then
        ngx.log(ngx.ERR, "failed to set DER priv key: ", err)
        return
    end

    ngx.log(ngx.DEBUG, 'Convert certificate pem to DER format');
    -- cert already contains the private key as provided in token
    local client_cert, err = ssl.cert_pem_to_der(cert);
    if not client_cert then
        ngx.log(ngx.ERR, "failed to convert PEM cert to DER: ", err)
        return
    end

    ngx.log(ngx.DEBUG, 'Set certificate DER');
    ok, err = ssl.set_der_cert(client_cert)
    if not ok then
        ngx.log(ngx.ERR, "failed to set DER cert: ", err)
        return
    end
end


ngx.log(ngx.INFO, 'Passing request to: ', ngx.var.target)

输出:

2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:270: Clearing fallback certificates
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:277: Convert private key pem to DER format
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:285: Set private key DER
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:292: Convert certificate pem to DER format
2018/03/06 13:55:31 [debug] 31#0: *12 [lua] analytics_access.lua:300: Set certificate DER
2018/03/06 13:55:31 [info] 31#0: *12 [lua] analytics_access.lua:309: Passing request to: https://blah blah...

在控制台上: 400 错误请求 未发送所需的 SSL 证书

【讨论】:

  • 我应该使用 parse_pem_cert、parse_priv_key 和 set_cert、set_key 来代替上面的吗?打算试试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2014-10-17
  • 2017-10-10
  • 2011-09-30
  • 2015-11-14
  • 1970-01-01
相关资源
最近更新 更多