首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Nginx -如何访问客户端证书的使用者备用名称(SAN)字段

Nginx -如何访问客户端证书的使用者备用名称(SAN)字段
EN

Stack Overflow用户
提问于 2018-05-31 05:47:18
回答 5查看 9.5K关注 0票数 9

我有一个Nginx服务器,客户端使用包含特定CN和SAN的客户端证书向其发出请求。我希望能够提取该客户端证书的CN (通用名称)和SAN (使用者备用名称)字段。

粗略示例配置:

代码语言:javascript
复制
server {
listen 443 ssl;
ssl_client_certificate /etc/nginx/certs/client.crt;
ssl_verify_client on; #400 if request without valid cert

location / {
    root    /usr/share/nginx/html;

}
location /auth_test {
    # do something with the CN and SAN.
    # tried these embedded vars so far, to no avail
    return 200 "
    $ssl_client_s_dn 
    $ssl_server_name
    $ssl_client_escaped_cert
    $ssl_client_cert
    $ssl_client_raw_cert";
}
}

使用作为ngx_http_ssl_module模块的一部分公开的嵌入式变量,我可以访问DN (唯一判别名),因此可以访问CN等,但是我似乎无法访问SAN。

我是否遗漏了一些嵌入式var /其他模块/通用Nginx foo?我可以访问原始证书,那么是否可以手动解码并提取它?

我真的更愿意在Nginx层做这件事,而不是将证书传递到应用层并在那里完成。

任何帮助都非常感谢。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-01 05:58:08

您可以通过OpenResty + Lua-OpenSSL并解析原始证书来获取它。

参考:https://github.com/Seb35/nginx-ssl-variables/blob/master/COMPATIBILITY.md#ssl_client_s_dn_x509

就像这样:

代码语言:javascript
复制
local varibleName = string.match(require("openssl").x509.read(ngx.var.ssl_client_raw_cert):issuer():oneline(),"/C=([^/]+)")
票数 3
EN

Stack Overflow用户

发布于 2019-05-16 20:45:19

您可以使用Nginx-builtin map提取它们,例如,对于CN:

代码语言:javascript
复制
map $ssl_client_s_dn $ssl_client_s_dn_cn {
    default "";
    ~,CN=(?<CN>[^,]+) $CN;
}
票数 12
EN

Stack Overflow用户

发布于 2019-05-30 08:31:53

我不是lua专家,但以下是我的工作:

代码语言:javascript
复制
local openssl = require('openssl')

dnsNames = {}
for k,v in pairs(openssl.x509.read(ngx.var.ssl_client_raw_cert):extensions()) do
    for k1,v1 in pairs(v:info()) do
        if(type(v1)=='table') then
            for k2,v2 in pairs(v1) do
                if(type(v2)=='table') then
                    for k3,v3 in pairs(v2) do
                        if(k3=='dNSName') then
                            table.insert(dnsNames, v3:toprint())
                        end
                    end
                end
            end
        end
    end
end
ngx.say(table.concat(dnsNames, ':'))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50613782

复制
相关文章

相似问题

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