首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于客户端证书的nginx授权

问基于客户端证书的nginx授权
EN

Stack Overflow用户
提问于 2017-01-06 19:58:36
回答 1查看 4.9K关注 0票数 4

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

我现在要寻找的是使用有关客户端的信息来允许访问API的不同部分(URL),但拒绝对其他部分的访问。我可以使用IP地址和ngx_http_access_module来完成这一任务,如下所示:

代码语言:javascript
复制
location /allowed/loc {
    allow 192.168.1.0/24;
}

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

我正在寻找的是允许/拒绝基于客户端证书而不是IP地址的某种方法(类似于以下内容):

代码语言:javascript
复制
location /authorize/by/cert {
    allow client-cert-serial;
    deny all;
}

在nginx中有办法做到这一点吗,或者我需要使用其他的东西吗?还是我想错了?

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-07 01:00:30

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

代码语言:javascript
复制
location /not/for/jhon/ {
   if ($ssl_client_s_dn ~ Jhon) {
      return 403;
   }
}

维护允许的map指令证书列表的好方法。示例

代码语言:javascript
复制
map $ssl_client_s_dn $ssl_access {
default 0;
01 1;
02 1;
}

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

或者,规则可能更复杂

代码语言:javascript
复制
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/之前阅读本文。只将if与return或rewrite ... last;指令一起使用。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41513400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档