. У меня есть парк пограничных компьютеров Ubuntu, на которых размещены простые веб-серверы HMI. Многие используют динамические IP-адреса, где переадресация портов недоступна.
Таким образом, для доступа к ним каждый использует autossh для создания обратного туннеля на центральный облачный прокси-сервер. Затем я могу получить доступ к каждому из них с помощью https://proxy.mydomain.com:6001, 6002 и т. д. Это работает.
Теперь я хочу использовать NGINX, чтобы нам не приходилось запоминать номера портов. Таким образом, у каждого объекта будет свой собственный поддомен :https://site1.mydomain.com, site2 и т. д. Все поддомены будут указывать на мой прокси-сервер. Затем NGINX должен просмотреть поддомен и проксировать https-трафик на соответствующий порт обратного туннеля.
Конфигурация NGINX показана ниже.
Моя проблема на данный момент заключается в том, что NGINX хочет, чтобы я определил SSL-сертификат. Однако я хотел бы использовать сертификаты, уже установленные на каждом из пограничных компьютеров.
Итак, как мне передать эти сертификаты клиенту через прокси-сервер NGINX?
Если это невозможно, -как лучше всего определить один или отдельные сертификаты на прокси-сервере, которые можно использовать для всех под-доменов?
server {
listen 443 ssl;
server_name site1.mydomain.com;
location / {
proxy_set_header Host $host;
proxy_pass https://127.0.0.1:6001;
proxy_ssl_server_name on;
proxy_redirect off;
}
}
server {
listen 443 ssl;
server_name site2.mydomain.com;
location / {
proxy_set_header Host $host;
proxy_pass https://127.0.0.1:6002;
proxy_ssl_server_name on;
proxy_redirect off;
}
}
Вы можете использовать модуль stream
для прохождения через протокол TLS, как-для клиентов.
Я не использовал эту конфигурацию сам, поэтому она может быть не на 100% точной, но должна показать принципы.
stream {
listen 443;
ssl_preread on;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass $upstream;
}
map $ssl_preread_server_name $upstream {
site1.example.com 127.0.0.1:6001;
site2.example.com 127.0.0.2:6002;
default site1;
}
В блоке stream
мы включаем предварительное-чтение данных протокола SSL. Nginx извлекает поле SNI в переменную $ssl_preread_server_name
.
Мы используем функцию map
для преобразования предварительно прочитанного имени сервера в место назначения. Затем пункт назначения используется как пункт stream
модуля proxy_pass
.
Здесь nginx считывает только имя хоста для SSL-соединения, а затем проксирует TCP-соединение к месту назначения для этого имени хоста.