1

在以下场景中,

[client]---https--->[Nginx]---http--->[app server]

我将如何(以及什么)传递给应用服务器以唯一标识证书?也就是说,Nginx 验证证书,但应用服务器看不到它。我需要区分应用服务器上的用户,所以他们不能互相冒充。

4

2 回答 2

2

您可以采用与此问题中针对 Apache Httpd描述的相同的技术。你需要 Nginx 等价物:

RequestHeader set X-ClientCert ""
RequestHeader set X-ClientCert "%{SSL_CLIENT_CERT}s"

我没试过,但是Nginx SSL 模块的文档有一个关于“嵌入式变量”的部分。进一步来说:

$ssl_client_cert为已建立的 SSL 连接返回 PEM 格式的客户端证书,除第一行之外的每一行都以制表符开头;这是为了在 proxy_set_header指令中使用;

这看起来就像您需要的反向代理设置,就像您拥有的那样。

请注意,清除此标头非常重要,否则客户端可以自己设置标头并使用他们喜欢的任何证书。

然后,您希望如何在应用程序服务器中检查这一点取决于您使用的平台。例如,在 Java 中,您可以编写一个过滤器(或 Tomcat 阀)来设置来自此自定义 HTTP 标头的请求中的参数。

于 2013-09-13T16:18:09.307 回答
0

It sounds like you want to use Nginx for SSL termination, but you want the backend servers to be able to tell with the original request was over HTTPS or HTTP. I think something this could work:

server {
    ssl on;
    listen 443;

    add_header  X-Forwarded-Proto  https;

    proxy_pass ...
}

# If you need insecure requests as well
server {
    listen 80;

    add_header  X-Forwarded-Proto  http;

    proxy_pass ...
}

Then your app server can check the value of the X-Forwarded-Proto header.

This is the same design pattern that Amazon Web Services uses for terminating SSL at their Elastic Load Balancers. They also set the X-Forwarded-Proto header for backend servers to check.

于 2013-09-13T15:44:01.843 回答