使用客户端SSL唯一标识客户端

时间:2013-09-13 11:35:47

标签: ssl nginx

在以下场景中,

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

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

2 个答案:

答案 0 :(得分:1)

您可以采用与{Httpd} this question中描述的相同的技术。你需要Nginx等同于:

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

我还没有尝试过,但Nginx SSL module的文档中有一个关于"嵌入式变量"的部分。更具体地说:

  

$ssl_client_cert以PEM格式返回已建立SSL连接的客户端证书,每行除了第一个前置   与制表符;这是打算用于   proxy_set_header指令;

这看起来就像你所拥有的反向代理设置一样。

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

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

答案 1 :(得分:0)

听起来您希望使用Nginx进行SSL终止,但您希望后端服务器能够通过HTTPS或HTTP判断原始请求。 我认为这可能有用:

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 ...
}

然后您的应用服务器可以检查X-Forwarded-Proto标头的值。

这与Amazon Web Services用于在其Elastic Load Balancers上终止SSL的设计模式相同。他们还为后端服务器设置X-Forwarded-Proto标头以进行检查。