Назад | Перейти на главную страницу

Обратный прокси NGINX с несколькими настраиваемыми портами SSL

РЕДАКТИРОВАТЬ: после комментариев, дополнительного чтения и нескольких раундов с хорошими коллегами мы пришли к выводу, что до тех пор, пока у нас нет контроля над внутренним сервером, использование настраиваемых портов SSL будет невозможно, поскольку мы не можем дать инструкции серверная часть, чтобы облегчить это. Я все же оставлю этот вопрос здесь, так как это может помочь другим в будущем прийти к такому же выводу и не тратить впустую часы исследований. И небольшой шанс, что кто-то может доказать, что мы неправы.

У нас есть чат-сервер, на котором клиенты могут напрямую связаться с нашими представителями CS. У нас есть несколько веб-сайтов в разных доменах, с которых обслуживается окно чата iframe, и поэтому из-за проблемы межсайтового скриптинга нам необходимо обслуживать несколько разных сертификатов SSL на обратном прокси-сервере. Чтобы решить эту проблему без настройки одного обратного прокси-сервера NGINX для каждого домена (их много), мы хотели бы обслуживать все домены на настраиваемых портах на одном NGINX, чтобы он выглядел так:

chat.domainA.com:443 -> chat_server: 80

chat.domainB.com:2001 -> chat_server: 80

chat.domainC.com:2002 -> chat_server: 80

Вот как я попытался установить обратный прокси NGINX:

server {
    listen 443 ssl;
    server_name chat.domainA.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainAbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainA.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
server {
    listen 2001 ssl;
    server_name chat.domainB.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainBbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainB.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
server {
    listen 2002 ssl;
    server_name chat.domainC.com;

    access_log /var/log/nginx/ssl-access.log;
    error_log /var/log/nginx/ssl-error.log;

    ssl_certificate /etc/nginx/ssl/chat.domainCbundle.com.crt.pem; # Cert chain
    ssl_certificate_key /etc/nginx/ssl/chat.domainC.com.key.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    [...]
    SSL Specific information, ciphers, etc
    [...]

    location / {
        proxy_pass http://internal_chat_server/;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Проблема в том, что если мы, например, https://chat.domainB.com:2001 затем мы перенаправляемся обратно на https://chat.domainB.com (на порт 443), где, очевидно, мы получаем ошибку сертификата, так как это chat.domainA.comсертификат, прослушивающий этот порт. Подключения к https://chat.domainA.com работает отлично.

Мы попробовали несколько решений, чтобы заставить обратный прокси-сервер сохранять номер порта, но, что бы мы ни пробовали, он все равно возвращается к порту 443.

Мы поигрались с перезаписью и подпапками, перенаправлениями (что вызывает цикл), proxy_set_header Хост $ host: $ server_portи т.д. но ничего не помогает. Пожалуйста, не рассматривайте приведенную выше конфигурацию как нашу единственную попытку, это был просто «чистый» код.

Внутренний чат-сервер - это устройство Cisco, которое мы не можем настраивать самостоятельно, поэтому любую настройку необходимо выполнять на обратном прокси-сервере. Действительно ли нам нужно настраивать обратный прокси-сервер для каждого домена или есть что-то, что мы упустили?

Любая помощь высоко ценится.