Прохождение nginx tls для одного IP-адреса, не основанного на SNI?

У меня развернут обратный прокси-сервер nginx. у меня мало услуг

  1. Служба A: служба https с собственным сертификатом, работающим на порту 8080.
  2. Служба B: служба https с собственным сертификатом, работающим на порту 8080.

У нас всего 1 точка входа в приложение через nginx и через IP адрес а не dns имена. Мы хотим выполнить маршрутизацию на основе пути. Если запрашивается /servicea, нам нужно перенаправить запрос в службу A, а сертификаты должны относиться к службе A. Аналогично для службы B.

Изучил решение на основе SNI, но оно работает на основе имени хоста. Как мы можем достичь вышеуказанной конфигурации в nginx?

server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;

        listen 443 ssl;

        root /usr/share/nginx/html;
        index index.html;

        server_name localhost;
        ssl_certificate /etc/nginx/ssl/tls.crt;
        ssl_certificate_key /etc/nginx/ssl/tls.key;

        location / {
                try_files $uri $uri/ =404;
        }
        location /servicea/ {
            proxy_pass https://servicea:8080/;

        }

}

person Tech_Lover    schedule 07.01.2021    source источник


Ответы (1)


TL;DR: то, что вы хотите, невозможно.

Прохождение TLS означает, что nginx не прерывает соединение TLS, а просто передает исходные данные. Таким образом, клиент выполняет TLS клиент-сервер с конечным сервером вместо клиент-сервер-nginx + nginx-сервер.

Но в случае прохождения TLS nginx не может видеть HTTP-запрос внутри TLS-соединения, поскольку он зашифрован на уровне «клиент-сервер». И поскольку путь находится только внутри этого HTTP-запроса, nginx не может выполнять маршрутизацию на основе пути.

person Steffen Ullrich    schedule 07.01.2021
comment
Есть ли альтернативные решения, если у нас нет DNS? так как есть только одна точка входа. - person Tech_Lover; 07.01.2021
comment
@Tech_Lover: Вам нужно что-то другое в соединении или запросе, чтобы принять решение. Если IP тот же и доменное имя такое же, то на самом деле нет ничего другого, поэтому невозможно принять решение. - person Steffen Ullrich; 07.01.2021
comment
Что, если у нас есть копия сертификатов службы на nginx. Все запросы могут завершаться на nginx. Основываясь на пути, можем ли мы вернуть конкретный сертификат? - person Tech_Lover; 08.01.2021
comment
@Tech_Lover: рукопожатие TLS уже включает отправку сертификата сервера. Запрос HTTP отправляется только после успешного рукопожатия TLS, поэтому путь известен только после того, как сертификат сервера уже отправлен. Невозможно отправить потом еще один сертификат. Однако теперь можно направить этот запрос на основе бани на нужный сервер. Но это прозрачно для клиента, т. е. никакие новые сертификаты не видны с точки зрения клиента. Это также больше не TLS passthrough, то есть это шифрование клиент-nginx и nginx-сервер, а не клиент-сервер. - person Steffen Ullrich; 08.01.2021