在 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 日志能提到缺少的指令,我会更高兴。我不得不通过反复试验来弄清楚。但很高兴它终于成功了。