SSL客户端证书auth与ruby(sinatra)

时间:2014-03-03 17:21:50

标签: ruby ssl sinatra thin client-certificates

如何在sinatra中授权API,以便只允许拥有已知客户端证书(或由可信CA颁发的证书)的呼叫者呼叫它?

目前我正在使用'瘦'网络服务器,但如果有必要,我愿意接受其他选择。

2 个答案:

答案 0 :(得分:2)

由于您使用Thin,我认为目前不可能这样做,因为对等验证似乎已被破坏。见https://github.com/macournoyer/thin/pull/203

  

“EM的get_peer_cert方法除非已经验证了证书,否则不会返回任何内容。”瘦身的--ssl-verify选项实际上没有做任何事情。这两个行为相结合意味着env ['rack.peer_cert'在瘦1.2.8中引入的,总是返回nil。由于--ssl-verify从未实际导致验证发生,因此最好在完全验证过程到位之前删除该选项。但是,peer_cert可以通过始终“验证”证书在--ssl模式下使用,从而提供客户提供的证书(如果有),可以在env ['rack.peer_cert']中找到。“

我认为Uri Agassi通过推荐乘客是部分正确但我担心nginx / thin组合会带来安全风险,如果你希望证书作为身份验证,如果瘦身从nginx服务器移出,从而暴露你的瘦服务器。我认为嵌入式应用服务器解决方案是可行的方式(乘客)。

答案 1 :(得分:1)

您可以使用nginx来处理您的客户证书 - 这是blog post,其中显示了如何设置它:

server {
    listen        443;
    ssl on;
    server_name example.com;

    ssl_certificate      /etc/nginx/certs/server.crt;
    ssl_certificate_key  /etc/nginx/certs/server.key;
    ssl_client_certificate /etc/nginx/certs/ca.crt;
    ssl_verify_client optional;

    location / {
        root           /var/www/example.com/html;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME /var/www/example.com/lib/Request.class.php;
        fastcgi_param  VERIFIED $ssl_client_verify;
        fastcgi_param  DN $ssl_client_s_dn;
        include        fastcgi_params;
    }
}
     

我们指定服务器的证书(server.crt)和私钥   (server.key)我们指定用于签署客户端的CA证书   证书(ca.crt)我们将ssl_verify_client设置为optional。这个   告诉nginx尝试验证SSL证书(如果提供)。我的   API允许经过身份验证和未经身份验证的请求,但是如果   您只想允许经过身份验证的请求,您可以继续   将此值设置为on。

您可以使用thin with nginx,但我相信在这种情况下使用passenger with nginx会更受欢迎,而且很容易部署。


ssl_verify_client optional解释为here

  

ssl_verify_client

Syntax:   ssl_verify_client on | off | optional | optional_no_ca
Default:  off
Context:   http | server
Reference:    ssl_verify_client
     

该指令可以验证客户端身份。   参数'optional'使用其证书检查客户端身份   如果它可供服务器使用。