NGINX基础位置子路径每个都有不同的TLS证书和密钥

问题:我们的NGINX实现有几个不同操作类型的基础位置,例如/analytics,/topology,...;每个位置都有自己的access_by_lua_file,它打开一个包含必须被验证和处理的几个内容的令牌,包括一个新的右边路径,完整的具有自己的证书、密钥和ca。我们的问题是,似乎没有办法通配proxy_ssl_certificate,proxy_ssl_certificate_key和proxy_ssl_trusted_certificate变量,因为它们需要静态文件路径。

问题:是否有任何方法可以动态配置证书和密钥,即使我们需要承受性能损失?我们知道以下限制,但坦率地说,我们很惊讶为什么互联网上还没有出现解决方案。

这种不支持的原因有2个:

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

这个问题的解决方案似乎不起作用。以下是代码:

if cert ~= nil and key ~= nil then

    -- 清除 ssl_certificate 和 ssl_certificate_key 指令在代理.conf 中设置的备用证书和私钥
    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 Bad Request 未发送所需的 SSL 证书

2018-03-06 13:59:19
用户2060502
用户2060502

以下是我在一个 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 上的内容完全相同。

2018-03-06 16:18:29