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

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

У меня есть заголовки идентификатор пользователя и пароль , которые будут отличать запрос 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 идут без прикрепления сертификаты.

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

0
задан 13 August 2019 в 21:48
1 ответ

На основе комментария от Michael проявленный подход был неправильным. Nginx только послушает на server_names, которые внешне доступны как имена хостов. Я был неправильно вдохновлен многими QnAs, которые показали отображение www non-www именам хостов. Который полностью отличался, поскольку имя хоста example.com было все еще доступно.

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

0
ответ дан 23 November 2019 в 22:18

Теги

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