我正在尝试使用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日志中观察客户证书详细信息