【问题标题】:nginx authorization based on client certificates基于客户端证书的nginx授权
【发布时间】:2017-01-06 19:58:36
【问题描述】:

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

我现在正在寻找的是使用有关客户端的这些信息来允许访问 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 中做到这一点,还是我需要使用其他东西?还是我认为这一切都错了?

感谢您的帮助。

【问题讨论】:

    标签: ssl nginx authorization


    【解决方案1】:

    对于访问检查,您可以使用 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/之前阅读这篇文章。仅将ifreturnrewrite ... last; 指令一起使用。

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 1970-01-01
      • 2017-06-08
      • 2011-08-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多