在以下场景中,
[client]---https--->[Nginx]---http--->[app server]
我将如何(以及如何)传递给应用服务器以唯一标识证书?也就是说,Nginx验证证书,但应用服务器没有看到它。我需要区分应用服务器上的用户,因此他们无法互相冒充。
答案 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
标头以进行检查。