Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails控制器可以请求相互SSL身份验证吗?_Ruby On Rails_Security_Ssl - Fatal编程技术网

Ruby on rails rails控制器可以请求相互SSL身份验证吗?

Ruby on rails rails控制器可以请求相互SSL身份验证吗?,ruby-on-rails,security,ssl,Ruby On Rails,Security,Ssl,可在Rails控制器上用于请求SSL。但是,控制器是否有任何方法请求相互身份验证,如果有,控制器、请求上下文如何在SSL/TLS握手过程中发现客户端提供的证书?您可以使用request.cgi访问客户端证书 certificate = request.cgi.env_table['SSL_CLIENT_CERT'].gsub(/(\n|-----(BEGIN|END) CERTIFICATE-----)/, ''); 现在,您可以根据此证书查找用户 有关更多信息,请参阅 我不确定这是否仅在您使

可在Rails控制器上用于请求SSL。但是,控制器是否有任何方法请求相互身份验证,如果有,控制器、请求上下文如何在SSL/TLS握手过程中发现客户端提供的证书?

您可以使用request.cgi访问客户端证书

certificate = request.cgi.env_table['SSL_CLIENT_CERT'].gsub(/(\n|-----(BEGIN|END) CERTIFICATE-----)/, '');
现在,您可以根据此证书查找用户

有关更多信息,请参阅

我不确定这是否仅在您使用特定服务器(例如ApacheW.passenger)时有效

编辑:


可能也很有用。

我知道这是一个老问题,但是,当您试图了解如何使用Rails应用程序进行相互身份验证时,这是最热门的问题。我花了很多时间来寻找好文章和好方法。所以,让我在这里分享我的发现。我希望它能帮助下一个试图找到相同答案的人

基本上,这是有可能的,但你需要做一些技巧。因为只有在TLS握手过程中才能获取客户端证书

我认为大多数Rails web应用程序设计为在代理服务器或负载平衡器后面运行。在这种情况下,TLS握手过程已经在web请求到达Rails控制器之前完成

因此,有几个技巧可以使用

  • 使用Ruby HTTP客户端运行独立端点,并提供所有必需的根证书和私钥。从rails控制器,您需要强制重定向到该Ruby HTTP客户端的端点,直到您的客户端(浏览器)使用客户端证书成功进行身份验证
  • 配置需要相互TLS身份验证的NGINX,然后将实际的原始客户端证书从HTTP请求传递给Rails控制器。所以,通过这种方式,您需要为Nginx配置设置特殊的url或特殊端口,并且需要从Rails控制器强制重定向该端点。这个特殊的端点可以用HTTP参数(X-SSL-CERT$SSL\U client\U raw\U CERT)代理您的实际Rails控制器。因此,您可以从那里读取实际的客户端证书,并使用Ruby OpenSSL库对其进行验证

如果您需要更多信息,

考虑到控制器在握手后很长时间才执行,我想控制器只能注意到相互身份验证已经发生或没有发生,正确的配置位置是HTTP服务器(即Apache)。如果请求包含客户端证书,问题仍然存在。