【问题标题】:SSL client certificate auth with ruby (sinatra)使用 ruby​​ (sinatra) 进行 SSL 客户端证书身份验证
【发布时间】:2014-04-04 21:02:46
【问题描述】:

如何在 sinatra 中授权 API,以便只有拥有已知客户端证书(或由受信任的 CA 颁发的证书)的调用者才能调用它?

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

【问题讨论】:

    标签: ruby ssl sinatra thin client-certificates


    【解决方案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 设置为可选。这 告诉 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
    

    此指令启用客户端身份验证。 参数“可选”使用其证书检查客户端身份 以防它可供服务器使用。

    【讨论】:

    • 谢谢!这确实是朝着正确方向迈出的一步。你能解释一下“可选”验证是如何工作的,或者指向我的文档吗?我的 Sinatra api 方法将如何确定客户端是否提供了有效证书?
    【解决方案2】:

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

    " EM 的 get_peer_cert 方法除非证书已经过验证,否则不会返回任何内容。thin 的 --ssl-verify 选项实际上什么都不做。这两种行为结合起来意味着 env['rack.peer_cert' ],在瘦 1.2.8 中引入,总是返回 nil。由于 --ssl-verify 从未真正导致验证发生,最好在完全验证过程到位之前删除该选项。但是,peer_cert可以通过始终“验证”证书在 --ssl 模式下提供,从而提供客户端提供的证书,如果有的话,在 env['rack.peer_cert'] 中可用。"

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

    【讨论】:

    • 我当然愿意接受其他建议而不是瘦弱。我会调查乘客。你有这方面的puma数据吗?
    猜你喜欢
    • 2021-02-11
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2015-10-29
    • 2018-07-05
    • 2019-01-14
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多