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

Как настроить nginx для прокси по порту и хосту с разными сертификатами SSL для каждого?

(обновлено) Я хотел бы использовать такие запросы прокси:

https://port123.host.com:85/any/path ==> http://server85:123/any/path
https://port567.host.com:85/any/path ==> http://server85:567/any/path
https://port123.host.com:86/any/path ==> http://server86:123/any/path
https://port567.host.com:86/any/path ==> http://server86:567/any/path

Как вы порекомендуете мне этого добиться? (Я знаю, что это забавная архитектура)

Объявления сервера работают без SSL, с ним - нет.

server {
    listen 86 ssl;
    server_name port123;
    ssl_certificate CERT123;
    ssl_...;
    localtion / { proxy_pass.... }
}

server {
    listen 86 ssl;
    server_name port567;
    ssl_certificate CERT567;
    ssl...;
    localtion / { proxy_pass.... }
}

Я вижу, что это известное ограничение nginx (несколько SSLS на одном порту и одном IP). Но мне интересно, есть ли простой обходной путь. Я не могу использовать SAN, потому что каждый мой сервер фактически является подстановочным знаком с подстановочным сертификатом.

Вы можете создать серверный блок для каждого порта, который должен прослушивать nginx. Внутри блока server вы можете перенаправить на комбинацию host: port. Попробуйте это ... он должен делать то, что вы просили:

server {
  listen       85;
  listen       [::]:85;
  server_name  port123.host.com;

  location / {
    proxy_pass         http://server85:123/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

server {
  listen       86;
  listen       [::]:86;
  server_name  port567.host.com

  location / {
    proxy_pass         http://server86:567/;
    proxy_redirect     off;

    proxy_set_header   Host             $host;
    proxy_set_header   X-Real-IP        $remote_addr;
    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  }
}

В итоге я сделал это с отдельным IP-адресом для каждой конечной точки SSL. Поскольку сеанс TLS происходит без заголовка хоста, nginx не может «угадать», какой сертификат использовать. Так что IP-адреса исправляют это, и у меня есть некоторые доступные. Так:

server {
    listen 192.168.1.5:85 ssl;
    server_name port123;
    ssl_certificate     /port123.crt;
    ssl_certificate_key /port123.key;
    location / {
        proxy_pass http://server85:123/;
    }
}

server {
    listen 192.168.1.6:86 ssl;
    server_name port123;
    ssl_certificate     /port567.crt;
    ssl_certificate_key /port567.key;
    location / {
        proxy_pass http://server86:567/;
    }
}

На самом деле у меня больше комбинаций, и я также по-другому устанавливаю заголовки. Но наконец это работает.

Как всегда, лучшие статьи на nginx: http://nginx.org/en/docs/http/configuring_https_servers.html