#nginx #ssl #kubernetes #tls1.2 #nginx-reverse-proxy
#nginx #ssl #kubernetes #tls1.2 #nginx-обратный прокси
Вопрос:
У меня развернут обратный прокси-сервер nginx. У меня мало сервисов
- Служба A: служба https с собственным сертификатом, работающая на порту 8080.
- Служба 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/;
}
}
Ответ №1:
TL; DR: то, чего вы хотите, невозможно.
Сквозная передача TLS означает, что nginx не прерывает TLS-соединение, а просто передает исходные данные. Таким образом, клиент выполняет протокол TLS «клиент-сервер» с конечным сервером вместо «клиент-nginx nginx-to-server».
Но в случае прохождения TLS nginx не может видеть HTTP-запрос внутри TLS-соединения, поскольку он зашифрован между клиентом и сервером. И поскольку путь находится только внутри этого HTTP-запроса, nginx не может выполнять маршрутизацию на основе пути.
Комментарии:
1. Существуют ли альтернативные решения , если у нас нет dns ? поскольку существует только одна точка входа.
2. @Tech_Lover: Вам нужно что-то другое в соединении или запросе, чтобы принять решение. Если IP-адрес один и тот же и доменное имя одно и то же, то на самом деле нет ничего другого, так что принять решение невозможно.
3. Что, если у нас есть копия сертификатов servicea на nginx самостоятельно. Все запросы могут завершаться в nginx. Основываясь на пути, можем ли мы вернуть обратно конкретный сертификат?
4. @Tech_Lover: Подтверждение связи TLS уже включает отправку сертификата сервера. HTTP-запрос отправляется только после успешного подтверждения связи TLS, и, таким образом, путь известен только после того, как сертификат сервера уже был отправлен. Затем невозможно отправить другой сертификат. Однако теперь можно направить этот запрос на основе bath на нужный сервер. Но это прозрачно для клиента, т. Е. Новые сертификаты не видны с точки зрения клиента. Это также больше не сквозная передача TLS, т.Е. Это шифрование клиент-nginx и nginx-сервер, а не шифрование клиент-сервер.