我正在尝试找到一种方法,从我的nginx / lua模块中向服务器发出安全的GET请求,以检查入口调用的身份验证。关于如何做到这一点似乎很少。我目前的尝试主要围绕使用resty.http和以下内容。
-- Create http client
local httpc = http.new();
httpc:set_timeout(500)
ngx.log(ngx.DEBUG, '**** Connect with TLS ****');
ok, err = httpc:connect(my_server, port);
然而,my_server在输入时需要cert,ca和key,但是再次,不知道如何使用[“ca”] = myca.pem;等...不起作用。如果我设置
lua_ssl_trusted_certificate=myca.pem
请求失败,并显示以下内容:
2018/02/23 19:22:17 [crit] 19#0: *4 SSL_shutdown() failed (SSL: error:140E0197:SSL routines:SSL_shutdown:shutdown while in init), client: 127.0.0.1, server: my_server
我看过https://github.com/brunoos/luasec/archive/luasec-0.6,但坦率地说无法在我的alpine linux容器上编译干净。 不知道在这一点上使用什么模块或如何进行,任何想法?
更新 基于评论的附加信息和我收到的答案。尝试使用 openresty pintsized lua-resty-http 与https失败,目前无法让 cert / key / ca 相互TLS流程正常工作。使用下面的答案,我能够配置对我的后端应用程序微服务的上游代理调用,以正确地为请求提供服务。 我的proxy.conf文件片段使其工作看起来像跟随。 注意:上游服务器必须与证书中的CN匹配,否则它将无法正常工作,或者至少我没有得到证明失败的信息。
http {
# Upstream backend for services
upstream apimy {
server apimy:3003;
}
...
location /api/analytics/token-info {
internal; # Specifies that a given location can only be used for internal requests
set $bearerToken $arg_token;
set $args "";
proxy_pass_request_headers on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
proxy_ssl_certificate /etc/certs/analytics_proxy_client_public.cert.pem;
proxy_ssl_certificate_key /etc/certs/analytics_proxy_client_private.key.pem;
proxy_ssl_trusted_certificate /etc/certs/analytics_proxy_client_ca.cert.pem;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse off;
proxy_set_header Host apimy;
proxy_set_header Content-Type "application/json";
proxy_set_header Accept "application/json";
proxy_set_header Authorization "Bearer $bearerToken";
proxy_pass https://apimy/api/analytics/token-info; # trailing slash
}
另一个注意事项,无论我怎么都不能让bearerToken工作从lua那边传递出来,我不得不把它作为一个arg传递,然后在那之后清除args,所以任何其他人都没有得到传入了电话。 我的lua代码调用路径。
-- Connect --
ngx.log(ngx.DEBUG, '**** Connect with TLS ****');
res = ngx.location.capture('/api/analytics/token-info',
{
method = ngx.HTTP_POST,
body = json.encode(query),
args = {
token = accessToken;
}
})