Nginx仅在特定位置validation客户端证书

我们使用Nginx作为我们Web应用程序服务器的反向代理。 Nginx处理我们的SSL等,但否则只是作为一个反向代理。

我们希望为/jsonrpc请求提供有效的客户端证书,但不要求在其他地方使用它们。 我们find的最好的方法是

 server { listen *:443 ssl; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/client-ca.crt; ssl_verify_client optional; location /jsonrpc { if ($ssl_client_verify != "SUCCESS") { return 403; } proxy_pass http://localhost:8282/jsonrpc-api; proxy_read_timeout 90; proxy_redirect http://localhost/ $scheme://$host:$server_port/; } } 

这对大多数浏览器来说都是正常的,但是一些浏览器(如Safari和Chrome上的Android)最终会提示用户提供一个客户端证书,无论他们去哪里。

除了我们的/jsonrpc位置,我们如何让Nginx接受但并不真正关心客户端证书?

为什么不尝试第二个服务器块? 代码重复是不好的,但有时是不可避免的。 我假设/ jsonrpc代表一个API,所以它可以使用自己的子域,如果尚未使用它:

 server { listen *:443 ssl; server_name api.example.com; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/client-ca.crt; ssl_verify_client on; location =/jsonrpc { proxy_pass http://localhost:8282/jsonrpc-api; proxy_read_timeout 90; proxy_redirect http://localhost/ $scheme://$host:$server_port/; } } server { listen *:443 ssl; ssl on; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_client_certificate /etc/nginx/client-ca.crt; ssl_verify_client off; location / { proxy_pass http://localhost:8282/; proxy_read_timeout 90; proxy_redirect http://localhost/ $scheme://$host:$server_port/; } }