根据可用的标头值,有条件地将证书附加到 nginx 反向代理中的请求

根据可用的标头值,有条件地将证书附加到 nginx 反向代理中的请求

我的 Web 应用程序前端有 Nginx 反向代理作为负载均衡器。托管的 Web 应用程序有两个组件。UI 和 API。UI 通常可以访问,但 API 需要客户端证书进行身份验证。两者都位于同一个主机名上,因为它们是单个 Web 应用程序的一部分。此外,客户端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/;
    }
}

此配置行为异常,有时 UI 请求会附加证书,有时 API 请求不会附加证书。

如果有其他方法可以实现,而无需多个服务器块,请帮忙。

答案1

根据 Michael 的评论,采取的方法是错误的。Nginx 将仅监听可作为主机名在外部使用的 server_names。我错误地受到许多 QnA 的启发,这些 QnA 显示将 www 映射到非 www 主机名。这完全不同,因为主机名example.com仍然可用。

通过使所需的主机名在外部可用,然后将其用作,解决了我的问题server_name

相关内容