我正在尝试使用使用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进行签名
发布于 2019-05-27 19:49:00
在Dancer中,您可以使用request->env->{'psgix.io'}获取IO::Socket::SSL对象,但这对您没有帮助,因为您没有机会将其配置为用于客户端验证。IO::Socket::SSL::set_defaults的运行时间也不够早。
这意味着最好设置Apache httpd或nginx来终止TLS。在环境变量中将所需的证书信息(例如,客户端验证结果)传递给Dancer应用程序。
发布于 2019-05-27 20:19:06
对于任何面临这个问题的人,我通过以下步骤解决了这个问题:(为了创建客户端和服务器证书,我遵循了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)使用plackup (或starman/您的首选)启动舞者应用程序
carton exec plackup -R /bin,/lib bin/app.psgi5)向服务器发送请求
curl -v https://localhost/ --key client_key.pem --cert client_cert.pem --cacert server_cert.pem6)您应该观察plackup日志中的客户端证书详细信息
https://stackoverflow.com/questions/56321938
复制相似问题