Я пытаюсь найти способ сделать безопасный запрос GET из моего модуля nginx/lua на сервер для проверки аутентификации входящего вызова. Кажется, там очень мало информации о том, как это сделать. Мои текущие попытки сосредоточены на использовании 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 требует сертификат, ca и ключ на входе, но опять же, не знаю, как это сделать, используя ["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 не увенчались успехом, в настоящее время просто нет способа заставить работать взаимный поток TLS cert/key/ca. Используя приведенный ниже ответ, я смог настроить восходящий прокси-вызов для моего микросервиса внутреннего приложения для правильного обслуживания запросов. Мои фрагменты файла 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 работать, передавая его как vars со стороны lua, мне пришлось передать его как аргумент, а затем очистить аргументы после этого, чтобы любые другие не были переданы в вызов. Мой код 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;
}
})