如何使用舞者/Starman或Mojolicious/Daemon对HTTPS客户端证书进行身份验证



我正在尝试使用Perl Dancer Framework使用HTTPS客户端证书执行身份验证。我想接受由/未经证书发送的请求,并在证书CN上进行验证以进行有效的答复(https://medium.com/@sevcsik/authentication-using-https-client-certificates-3c9d270e8326,该链接显示了如何在node.js中进行操作,需要Perl Dancer/Starman/Plackup非常相似的事情P>

我使用舞蹈家/羽毛的设置SSL,但尚未找到有关在Dancer Framework中执行验证的详细信息的方法

我想实现以下内容:

如果发送请求

没有证书=> 401

使用证书,但客户端具有自签名(CN与服务器证书不匹配(=> 401

使用证书,但客户证书已使用服务器证书签名(CN Matches Server Cert CN(=> 200

在舞者中,您可以使用request->env->{'psgix.io'}获取IO :: socket :: SSL对象,但是这对您无济于事,因为您没有机会将其配置为客户端验证。io :: socket :: ssl :: set_defaults也不够早。

这意味着最好设置Apache HTTPD或NGINX终止TLS。将所需的证书信息(例如客户端验证结果(传递给舞者应用程序。

对面对问题的任何人,我通过以下步骤解决了:(要创建客户端和服务器证书,我遵循https://medium.com/@sevcsik/authentication-using-https-client-certificates-3c9d270e8326(

1(使用nginx(设置指南:https://gist.github.com/netpoetica/5879685(

2(创建nginx config

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
    }
}

可以使用http://nginx.org/en/docs/http/ngx_http_http_ssl_module.html#variaiables

上提到的属性共享有关SSL的更多详细信息。

3(舞者应用程序

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

4(使用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(您应该在Plackup日志中观察客户证书详细信息

最新更新