【发布时间】:2014-04-04 21:02:46
【问题描述】:
如何在 sinatra 中授权 API,以便只有拥有已知客户端证书(或由受信任的 CA 颁发的证书)的调用者才能调用它?
目前我正在使用“瘦”网络服务器,但如果有必要,我愿意接受其他选择。
【问题讨论】:
标签: ruby ssl sinatra thin client-certificates
如何在 sinatra 中授权 API,以便只有拥有已知客户端证书(或由受信任的 CA 颁发的证书)的调用者才能调用它?
目前我正在使用“瘦”网络服务器,但如果有必要,我愿意接受其他选择。
【问题讨论】:
标签: ruby ssl sinatra thin client-certificates
您可以使用 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此指令启用客户端身份验证。 参数“可选”使用其证书检查客户端身份 以防它可供服务器使用。
【讨论】:
由于您使用的是 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 服务器中移出,从而暴露您的瘦服务器。我认为嵌入式应用服务器解决方案是可行的方法(作为乘客)。
【讨论】: