如何在sinatra中授权API,以便只允许拥有已知客户端证书(或由可信CA颁发的证书)的呼叫者呼叫它?
目前我正在使用'瘦'网络服务器,但如果有必要,我愿意接受其他选择。
答案 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'使用其证书检查客户端身份 如果它可供服务器使用。