基于客户端证书的nginx授权

时间:2017-01-06 19:58:37

标签: ssl nginx authorization

我在nginx中启用了SSL,并在浏览器中启用了客户端证书。有了这个,我可以通过端口443通过HTTPS访问我的网站。

我现在正在寻找的是使用有关客户端的这些信息来允许访问API的不同部分(URL),但拒绝访问其他部分。我可以使用IP地址和ngx_http_access_module执行此操作,如下所示:

location /allowed/loc {
    allow 192.168.1.0/24;
}

location /protected/loc {
    allow 192.168.1.10;
    deny all;
}

我正在寻找的是基于客户端证书而不是IP地址允许/拒绝的某种方式,即类似于此的内容:

location /authorize/by/cert {
    allow client-cert-serial;
    deny all;
}

有没有办法在nginx中执行此操作,还是需要使用其他内容?或者我认为这一切都错了?

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

对于访问检查,您可以使用if指令和ssl模块变量:$ssl_client_s_dn$ssl_client_serial。实施例

location /not/for/jhon/ {
   if ($ssl_client_s_dn ~ Jhon) {
      return 403;
   }
}

维护map指令允许认证列表的好方法。实施例

map $ssl_client_s_dn $ssl_access {
default 0;
01 1;
02 1;
}

server {
  ...
  location /authorize/by/cert {
     if ($ssl_access = 0) {
        return 403;
     }
  }
}

或者,规则可能更复杂

map $ssl_client_s_dn $ssl_access {
default "";
01 -a-b-c-;
02 -b-e-;
}

server {
  ...
  location /authorize/by/cert/a {
     if ($ssl_access !~ -a-) {
        return 403;
     }
  }

  location /authorize/by/cert/b {
     if ($ssl_access !~ -b-) {
        return 403;
     }
  }
}

但是在https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/之前阅读这篇文章。仅对ifreturn指令使用rewrite ... last;