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