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

Условно прикрепите сертификат к запросу в обратном прокси-сервере nginx на основе доступных значений заголовка

У меня есть веб-приложение с обратным прокси-сервером Nginx, работающее как LB. Размещаемое веб-приложение состоит из двух компонентов. UI и API. Пользовательский интерфейс обычно доступен, но для аутентификации API требуются клиентские сертификаты. Оба находятся на одном и том же имени хоста, поскольку являются частью одного веб-приложения. Кроме того, клиент использует то же имя хоста mywebApp.com для UI и API.

У меня есть заголовки userid и password что будет отличать запрос API от других запросов. Обычно, если в запросе присутствуют действительные и совпадающие заголовки, прикрепите proxy_ssl_certificate proxy_ssl_certificate_key proxy_ssl_trusted_certificate на запрос, иначе нет.

Моя идея состоит в том, чтобы перенаправить этот запрос на новое имя хоста / имя_сервера.

Вот моя конфигурация nginx.

upstream my-webapp {
    hash $remote_addr;
    server my-app-1:8443;
    server my-app-2:8443;
    server my-app-3:8443;
}
map $http_userid $valid_user {
    default 0;
    validUsername 1;
}
map $http_password $valid_pass {
    default 0;
    validPassword 1;
}
map $valid_user$valid_pass $new_host {
    default "mywebApp.com";
    11 "api.mywebApp.com";
}
server {
    listen 80;
    return 301 https://$host_new$request_uri;
}
server {
    listen 443 ssl;
    server_name mywebApp.com;
    #...setting proxy headers
    location / {
        proxy_pass https://my-webapp/;
    }
}
server {
    listen 443 ssl;
    server_name api.mywebApp.com;
    #...setting proxy headers
    #...Additionally attach below certs
    proxy_ssl_certificate /etc/nginx/certs/api-cert.pem;
    proxy_ssl_certificate_key /etc/nginx/certs/api-key.key;
    proxy_ssl_trusted_certificate /etc/nginx/certs/ca-cert.pem;
    location / {
        proxy_pass https://my-webapp/;
    }
}

Эта конфигурация ведет себя странно: иногда к запросам пользовательского интерфейса прикрепляются сертификаты, а иногда к запросам API не прикрепляются сертификаты.

Если есть другой способ добиться этого, без нескольких разделительных блоков, пожалуйста, помогите.

Судя по комментарию Майкла, выбранный подход был неправильным. Nginx будет прослушивать только имена server_name, которые доступны извне как имена хостов. Меня неправильно вдохновили многие QnA, которые показали сопоставление www с именами хостов без www. Что было совершенно другим, поскольку имя хоста example.com все еще был доступен.

Решил мою проблему, сделав желаемое имя хоста доступным извне, а затем используя его как server_name.