如何使用Dancer / Starman或Mojolicious / Daemon验证https客户端证书?

时间:2019-05-27 07:58:47

标签: perl ssl dancer

我正在尝试使用perl Dancer框架使用HTTPS客户端证书执行身份验证。 我想接受使用/不使用证书发送的请求,并对证书CN进行验证以继续进行有效的响应 (https://medium.com/@sevcsik/authentication-using-https-client-certificates-3c9d270e8326的链接显示了如何在node.js中执行此操作,对于perl Dancer / Starman / Plackup,它需要非常相似的内容)

我已经使用Dancer / Plackup设置了ssl,但没有找到一种方法来获取有关对等证书的详细信息以在Dancer框架中执行验证

我想实现以下目标:

如果请求已发送

没有证书=> 401

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

带有证书,但客户端证书已使用服务器证书签名(CN与服务器证书CN匹配)=> 200

2 个答案:

答案 0 :(得分:1)

在Dancer中,您可以使用request->env->{'psgix.io'}获取IO :: Socket :: SSL对象,但这无济于事,因为您没有机会对其进行配置以进行客户端验证。 IO :: Socket :: SSL :: set_defaults也无法足够早地运行。

这意味着最好设置Apache httpdnginx来终止TLS。在环境变量中将所需的证书信息(例如客户端验证结果)传递给Dancer应用程序。

答案 1 :(得分:1)

对于面临此问题的任何人,我可以通过以下步骤解决它: (要创建客户端和服务器证书,我遵循了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
    }
}

可以使用http://nginx.org/en/docs/http/ngx_http_ssl_module.html#variables上提到的属性来共享有关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日志中观察客户端证书的详细信息