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变量,因为它们需要静态文件路径。
问题:有没有办法动态配置证书和密钥,即使我们的性能受到影响?我们知道以下限制,但坦率地说,没有任何解决方法在互联网上出现。
缺乏支持有两个原因:
- Nginx需要在启动时加载整个SSL服务器配置,因此当证书或密钥不存在时会抛出错误。
- 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证书和密钥的主要内容,如果未能解决你的问题,请参考以下文章
在子路径中通过 nginx+uwsgi 运行 django app
如何设置NGINX以根据位置(在相同的server_name下)部署不同的单页应用程序(SPA的...即静态文件)和子路由