在以下场景中,
[client]---https--->[Nginx]---http--->[app server]
我将如何(以及什么)传递给应用服务器以唯一标识证书?也就是说,Nginx 验证证书,但应用服务器看不到它。我需要区分应用服务器上的用户,所以他们不能互相冒充。
您可以采用与此问题中针对 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 标头的请求中的参数。
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.