NGINX基本位置子路径,每个子路径具有不同的TLS证书和密钥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NGINX基本位置子路径,每个子路径具有不同的TLS证书和密钥相关的知识,希望对你有一定的参考价值。

问题:我们的nginx实现具有几种不同操作类型的基本位置,例如: / analytics,/ topology,...;并且每个都有自己的access_by_lua_file,它会打开传入的令牌,其中包含一些必须经过验证和处理的内容,包括一个新的右侧路径,包含自己的证书,密钥和ca.我们遇到的问题是似乎没有办法通配令proxy_ssl_certificate,proxy_ssl_certificate_key和proxy_ssl_trusted_certificate变量,因为它们需要静态文件路径。

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

缺乏支持有两个原因:

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

下面是我在其中一个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完全相同

另一答案

对这个问题的拟议答案似乎不起作用。这是代码:

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证书

以上是关于NGINX基本位置子路径,每个子路径具有不同的TLS证书和密钥的主要内容,如果未能解决你的问题,请参考以下文章

jQuery按类选择具有未知路径的子元素

如何从JAVA中的子文件夹中每次发送一个类的文件路径

在子路径中通过 nginx+uwsgi 运行 django app

如何设置NGINX以根据位置(在相同的server_name下)部署不同的单页应用程序(SPA的...即静态文件)和子路由

数据结构-前缀树trie

具有水平缩放的 UIScrollView - 在子视图中绘制的贝塞尔路径模糊