LINUX.ORG.RU

nginx для передачи запроса без дешифровки (ssl)

 


1

2

Всем здравствуйте! Возникла следующая задача: есть nginx, на который приходит https-запрос по 443 порту. Нужно передать его на другой сервер «как есть» без проверки сертификата (она будет выполняться дальше). Задача этого nginx - распределять запросы по разным серверам. Проверять SSL он не должен.

server {
        listen 443;
        server_name my.server.name; #тут имя нужного мне домена

        proxy_ssl_verify off;
        location / {
        	proxy_pass         https://172.17.0.2;
        }
}

Но nginx выдаёт непонятную ошибку в Access log (в hex-виде, поэтому не могу прочитать). Подозреваю, там что-то про то, что не удалось установить безопасное соединение с сервером (хотя могу ошибаться).

Можно ли как-то это реализовать?



Последнее исправление: Novascriptum (всего исправлений: 1)

listen 443

Это HTTP сервер, но на 443 порту. Ты можешь включить TLS, добавив в параметры «ssl», но так ты терминируешь TLS на Nginx’е. Бекенды увидят только Nginx в качестве клиента.

Скорее всего, тебе нужна балансировка TCP соединений: https://docs.nginx.com/nginx/admin-guide/load-balancer/tcp-udp-load-balancer/

i-rinat ★★★★★
()

У тебя автораизация клиентов по клиентским сертификатам используется? На одном IP и порту несколько доменов которые надо по разному обрабатывать? Тогда кажется единственный вариант это проверять клиентский сертификат силами nginx и передавать результат проверки на бекэнд кастомным http заголовком (так же как передаётся IP в стандартной связке nginx+apache).

На сколько я понимаю nginx не умеет разбирать https запрос, выуживать из него домен и в зависимости от этого домена либо обрабатывать как обычно, либо пробрасывать на бекэнд без ssl offload (на манер ngx_stream_core_module. Так что либо ssl offload на nginx, либо отдельный IP:порт для этого домена. Но возможно я ошибаюсь

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Не совсем понял про авторизацию клиентов, но да, на одном IP и порту у меня несколько доменов. Суть в том, что вот сейчас я поставил nginx, который получает запросы на 80 и 443 порты. И в зависимости от полученного доменного имени должен перебрасывать их дальше (локальная сеть). При этом проверку сертификата должен делать конечный сервер, а не этот промежуточный nginx.

Сейчас сделал вот такой конфиг:

stream {
    server {
        listen 80;
        proxy_pass 172.17.0.2:80;
    }
    
    server {
        listen 443;
        proxy_pass 172.17.0.2:443;
    }
}

Работает исправно, но только с одним сервером. Как только пытаюсь в секцию server{} добавить server_name, чтобы запросы с одних доменов пересылать на один IP, а с других - на другой, то натыкаюсь на ошибку:

nginx: [emerg] «server_name» directive is not allowed here

Это вот ограничение уже никак не обойти, да, если я правильно понял? Типа nginx не умеет вычленять доменное имя из https-запроса?

Novascriptum
() автор топика
Ответ на: комментарий от Novascriptum

При этом проверку сертификата должен делать конечный сервер, а не этот промежуточный nginx.

Что ты имеешь в виду под «проверкой сертификатов»?

MrClon ★★★★★
()
Ответ на: комментарий от Deleted

Я тоже так думаю, но думаю лучше подождать ответа ТСа

MrClon ★★★★★
()
Ответ на: комментарий от i-rinat

Думал nginx так не умеет, не догадался глянуть какие там ещё модули для stream есть

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Да, неправильно выразился. Речь о расшифровке запроса - её должен делать конечный в данной цепочке сервер, а не вот этот nginx, который у меня выступает в роли диспетчера (перенаправляет запросы к конечным серверам локальной сети в зависимости от доменного имени). Потом что SSL-сертификат устанавливается только вот на конечных серверах совсем другими людьми, которым не хотелось бы давать доступ на этот «диспетчер».

Novascriptum
() автор топика
Ответ на: комментарий от Novascriptum

Если я правильно понял, то nginx stream proxy должно помочь.

pod ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.