Передавайте сертификаты HTTPS с подчиненных серверов через прокси-сервер NGINX клиенту.

. У меня есть парк пограничных компьютеров 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;
    }
}
0
задан 18 November 2021 в 20:54
2 ответа

Вы можете использовать групповой сертификат *.mydomain.comдля своего прокси.
Этот закрытый ключ + сертификат будет работать для любого поддомена.
Либо бесплатно от let's encrypt (certbot), либо платно от центра сертификации, такого как digicert.

0
ответ дан 18 November 2021 в 23:54

Вы можете использовать модуль 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-соединение к месту назначения для этого имени хоста.

0
ответ дан 20 November 2021 в 20:50

Теги

Похожие вопросы