Требуются разъяснения для восходящего потока SSL на обратном прокси-сервере nginx
Я читал документацию nginx относительно обратного прокси и защиты ssl-соединений с вышестоящими серверами , но я все еще не понимаю, какие сертификаты ssl иди куда. Во многих примерах, которые я нахожу, nginx выполняет проксирование localhost, но в моей ситуации конечные точки находятся на разных серверах, портах и физических местоположениях.
Я бы хотел, чтобы несколько доменов разрешались на сервере nginx. У каждого из этих доменов есть сертификат ssl на текущем сервере для его фактического доменного имени.
Прямо сейчас у меня есть каждый сервер, работающий в своей собственной сети и физическом местоположении, но я хотел бы иметь единую точку для управления этими конечные точки.
Мой конечный результат должен выглядеть как
client
|
nginx
https://example1.com
https://example2.com
https://example3.com
x.x.x.x
|
-----------------------------------------
| | |
https://example1.com https://example2.com https://example3.com
a.b.c.d:1234 e.f.g.h:5678 i.j.k.l:9012
Прямо сейчас https://example1.com преобразуется в abcd: 1234, для которого установлен собственный сертификат ssl. Поскольку мне нужно показать клиентам, что сервер nginx обслуживает домен example1.com, я думаю, мне нужно, чтобы ssl example1.com был перемещен на внешний сервер nginx, верно? Если я это сделаю, какой SSL-сертификат я буду использовать на a.b.c.d: 1234 для поддержания безопасного восходящего соединения?
В документации nginx указано client.crt и server.crt, но CA использует домен для их регистрации. Что такое клиент и сервер в ситуации обратного прокси? Для меня клиент - это браузер, отправляющий запрос.
Какие ssl-сертификаты отправляются куда на обратном прокси?
Изменить:
Я уже знаю, что вы можете выглядеть так, как будто у вас есть безопасное соединение, просто поместив URL-адрес на основе сертификаты на прокси-сервере. Я надеюсь узнать, какие ssl-сертификаты поставить на внутренние серверы. Просто повторно использовать их соответствующие сертификаты? Может ли example1.com.crt
работать как на прокси-сервере, так и на внутреннем сервере?
Сертификат домена должен находиться там, где его «видят» клиенты, поэтому в вашем случае, если вы хотите, чтобы только сервер nginx был доступен из Интернета, все общедоступные сертификаты должны перейдите на сервер nginx.
Если вы хотите защитить бэкэнд-соединения, вы можете использовать любой сертификат на этих серверах. Вы даже можете использовать самозаверяющие и отключить проверку сертификатов на сервере nginx, но, вероятно, будет разумнее создать свой собственный ЦС и распространять сертификаты на бэкэнды.
Ваша конфигурация будет выглядеть точно так, как вы нарисовали, за исключением что внутренние серверы будут иметь внутренний сертификат, соответствующий их «внутреннему» имени:
client
|
nginx
(https://example1.com)
(https://example1.com)
(https://example1.com)
|
+---------------------------------------+-----------------------------------+
| | |
| | |
https://example1.internal.local/ https://example2.internal.local/ https://example3.internal.local/
a.b.c.d e.f.g.h i.j.k.l
Если внутренние серверы доступны из Интернета, то вы можете захотеть установить брандмауэр на их порты https, чтобы только сервер nginx мог их подключать.
Относительно вашего вопроса о клиенте и сервере: в сети клиент - это тот, кто инициирует соединение. Таким образом, в вашей настройке браузеры являются клиентами, а сервер nginx одновременно является клиентом и сервером: это сервер для браузеров, но он является клиентом для внутренних серверов.
Есть довольно много возможностей, вот 2:
Либо ваши клиенты общаются только с вашим обратным прокси (1), а nginx будет обрабатывать соединения с вышестоящими серверами, либо вы позволяете nginx сообщать вашим клиентам о подключении к другим серверам (2), которым требуется собственный общедоступный IP / DNS / сертификаты.
Вы можете (и, возможно, должны) также зашифровать трафик между вашим обратным прокси и вышестоящими серверами с помощью сертификатов,в зависимости от схемы вашей сети. Для этого вам по-прежнему нужен сертификат для каждого вышестоящего сервера, но они также могут быть самоподписанными (но не должны).
Если вы используете что-то вроде Let's Encrypt, в настоящее время создание SAN на сертификатах довольно просто, поэтому я обычно выбираю вариант 1.