Nginx - как получить доступ к полю альтернативного имени субъекта сертификата клиента (SAN) - PullRequest
0 голосов
/ 31 мая 2018

У меня есть сервер Nginx, к которому клиенты обращаются с сертификатом клиента, содержащим определенный CN и SAN.Я хочу иметь возможность извлекать поля CN (Common Name) и SAN (Subject Alternative Names) этого сертификата клиента.

примерный пример конфигурации:

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 / other module / general Nginx foo Мне не хватает?Я могу получить доступ к необработанному сертификату, поэтому можно ли его расшифровать вручную и извлечь?

Я бы предпочел сделать это на уровне Nginx, а не передавать сертификат на уровень приложений и делать это там.

Любая помощь очень ценится.

Ответы [ 4 ]

0 голосов
/ 30 мая 2019

Я не эксперт по Lua, но вот что у меня получилось:

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, ':'))
0 голосов
/ 30 апреля 2019

У меня была такая же проблема, когда я пытался получить "DN субъекта" на вышестоящем сервере.Кто-то может найти следующий совет полезным.Таким образом, есть доступ к таким полям, как («DN субъекта» и т. Д.) - вам нужно посмотреть link1 .Кроме того, мне пришлось пройти через эти данные в заголовок запроса, поэтому я сделал это через proxy_set_header ( link2 ).Это было возможно без каких-либо дополнительных расширений Nginx (их не нужно перестраивать с помощью --modules, только модули по умолчанию)

0 голосов
/ 16 мая 2019

Вы можете извлечь их с помощью встроенной в Nginx карты , например, для CN:

map $ssl_client_s_dn $ssl_client_s_dn_cn {
    default "";
    ~,CN=(?<CN>[^,]+) $CN;
}
0 голосов
/ 01 июня 2018

Вы можете сделать это через OpenResty + Lua-OpenSSL и проанализировать необработанный сертификат, чтобы получить его.

См. Это: https://github.com/Seb35/nginx-ssl-variables/blob/master/COMPATIBILITY.md#ssl_client_s_dn_x509

Просто так:

local varibleName = string.match(require("openssl").x509.read(ngx.var.ssl_client_raw_cert):issuer():oneline(),"/C=([^/]+)")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...