Как аутентифицировать клиентские сертификаты https с помощью Dancer / Starman или Mojolicious / Daemon? - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь выполнить аутентификацию с использованием клиентских сертификатов HTTPS, используя perl Dancer framework. Я хотел бы принять запросы, отправленные с / без сертификата, и выполнить проверку на сертификате CN, чтобы продолжить с действительным ответом (https://medium.com/@sevcsik/authentication-using-https-client-certificates-3c9d270e8326, ссылка показывает, как это сделать в node.js, нужно что-то очень похожее для Perl Dancer / Starman / Plackup)

Я настроил ssl с помощью Dancer / Plackup, но не нашел способа получить подробную информацию о сертификате однорангового узла для выполнения проверки в среде Dancer

Я бы хотел добиться следующего:

Если запрос отправлен

без сертификата => 401

с сертификатом, но клиент имеет собственную подпись (CN не совпадает с сертификатом сервера CN) => 401

с сертификатом, но сертификат клиента был подписан с использованием сертификата сервера (CN соответствует сертификату сервера CN) => 200

Ответы [ 2 ]

1 голос
/ 27 мая 2019

Для всех, кто столкнулся с проблемой, я решил ее, выполнив следующие шаги: (Для создания клиентских и серверных сертификатов я следовал https://medium.com/@sevcsik/authentication-using-https-client-certificates-3c9d270e8326)

1) Используйте nginx (Руководство по установке: https://gist.github.com/netpoetica/5879685)

2) Создайте конфигурацию nginx

server {
    listen 443 ssl;
    server_name localhost;
    ssl_certificate /to/path/server_cert.pem;  # server certificate
    ssl_certificate_key /to/path/server_key.pem; # server key

    ssl_client_certificate /to/path/server_cert.pem; # client CA => server certificate for self signed 
    ssl_verify_client on;

    location / {
        proxy_pass http://localhost:5000;
        proxy_set_header SSL_CLIENT_CERT $ssl_client_cert; #ENTIRE CLIENT CERTIFICATE
        proxy_set_header SSL_CLIENT_S_DN $ssl_client_s_dn; #SUBJECT DN
        proxy_set_header SSL_CLIENT_I_DN $ssl_client_i_dn; #ISSUER DN
    }
}

Более подробную информацию о ssl можно передать, используя атрибуты, указанные в http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables

3) Приложение Dancer

get '/' => sub {
    info to_dumper(request->headers);
    content_type 'text/xml';
    return "OK";
};

4) Запустите приложение Dancer, используя plackup (или starman / ваш предпочтительный выбор)

carton exec plackup -R /bin,/lib bin/app.psgi

5) Отправьте запрос на сервер

curl -v https://localhost/ --key client_key.pem --cert client_cert.pem --cacert server_cert.pem

6) Вам следуетсоблюдать информацию о сертификате клиента в журналах размещения

1 голос
/ 27 мая 2019

В Dancer вы можете получить объект IO :: Socket :: SSL с request->env->{'psgix.io'}, но это вам не поможет, потому что у вас нет возможности настроить его для проверки клиента.IO :: Socket :: SSL :: set_defaults также не запускается достаточно рано.

Это означает, что лучше всего настроить Apache httpd или nginx для прекращения TLS,Передайте необходимую информацию о сертификате (например, результат проверки клиента) в переменных среды в приложение Dancer.

...