根据 nginx 中的模式拒绝连接

根据 nginx 中的模式拒绝连接

在 nginx.conf 中,我添加了一个 if 子句来根据 cn 过滤 ssl 连接。

例如

map  $ssl_client_s_dn  $ssl_client_s_dn_cn {
    default "";
    ~/CN=(?<CN>[^/]+) $CN;
}

server {
    listen 80 default_server;
    server_name nginx-server;
    return 301 https://$server_name$request_uri;

    listen 443 ssl;
    listen [::]:443 ssl;
    
    server_name nginx-server;
    
    ssl_certificate /path/to/server/cert.pem
    ssl_certificate_key /path/to/nginx-server/privatekey.pem

    location / {

        if ($ssl_client_s_dn_cn !~ "client") {
            return 403;
        }
        root /usr/share/nginx/html;
        index index.html index.htm;
    }
}

现在,我尝试从命令行通过提供具有类似于 DN 的证书来卷曲,但C=GB,ST=London,L=City,O=MyOrg,OU=myOU,CN=client我收到 403 错误。

我也尝试了其他证书,无论证书 DN/CN 如何,我注意到 Nginx 返回 403。在访问日志中,我尝试将值记录$ssl_client_s_dn在日志中,但它是空白的。

我引用自http://nginx.org/en/docs/http/ngx_http_ssl_module.html

我在这里遗漏了什么?

更新:

如果我对以下函数中的值进行硬编码以返回客户端,则效果很好:

map  $ssl_client_s_dn  $ssl_client_s_dn_cn {
default "client";

}

我注意到根据 nginx 日志,ssl_client_s_dn 的值可能为空。这与启用 ngx_http_ssl_module 模块有关吗?

我检查了一下$ nginx V,认为该模块已列出。

输出附在图像中 在此处输入图片描述

不确定我遗漏了什么!有什么可以帮忙的吗?

谢谢,JE

答案1

我设法解决了这个问题。在此发布解决方案,希望它能帮助到遇到同样问题的人。

在我的配置中缺少位ssl_verify_client optional;直到我们指定我了解到,除非我们提及 ssl_verify_client on 或可选,否则不会设置 $ssl_client_s_dn 变量。它将继续打印空白。

事后看来,如果不启用客户端验证,服务器将如何处理客户端客户端主题 DN,这很有道理。但是,如果 nginx 日志能提到缺少的指令,我会更高兴。我不得不通过反复试验来弄清楚。但很高兴它终于成功了。

相关内容