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


14

我们使用Nginx作为Web应用程序服务器的反向代理。Nginx处理我们的SSL等,但否则仅充当反向代理。

我们想要要求有效的客户证书,/jsonrpc但在其他任何地方都不需要。我们发现的最好方法是

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和Android上的Chrome浏览器)最终会提示用户提供客户端证书,无论它们在网站上的哪个位置。

我们如何让Nginx接受但并不真正在乎我们/jsonrpc所在地以外的所有地方的客户证书?

Answers:


8

为什么不尝试使用第二个服务器块呢?代码重复是不好的,但有时是不可避免的。我假设/ 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/;
  }
}

如果我们找不到一种将正确的配置放在同server一块中的方法,那么我们可能最终会这样做。使用Apache时,我们没有遇到过同样的问题,所以我希望有一些设置可以在这里工作。
Eli Courtwright

1
@EliCourtwright我知道这个问题是很久以前的,但是您找到比两个服务器块更好的解决方案了吗?
N琼斯

2
@NJones:不幸的是,这就是我们必须要做的。
伊莱·考特赖特

如果对于同一域名www.example.com,所有内容都必须回答怎么办?这样的方法还能行吗?
Freedom_Ben
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.