我正在尝试使用OmniAuth对Facebook用户进行身份验证。最初,它正在工作,但一路上它只是停止工作,并开始给我这个错误信息:
OpenSSL :: SSL :: SSLError SSL_connect 返回= 1 errno = 0状态= SSLv3读取 服务器证书B:证书 验证失败
相同的代码适用于Twitter,我似乎无法理解为什么它不适用于Facebook。我在网上寻求帮助,但我没有成功。
这是我正在建设的网站的链接:http://www.bestizz.com/
此网址会显示错误消息:http://www.bestizz.com/auth/facebook
答案 0 :(得分:20)
Ruby无法找到任何根证书。以下是调试的选项。在脚本开头放置以下代码:
require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
答案 1 :(得分:8)
将以下代码添加到config / initializers / fix_ssl.rb
require 'open-uri'
require 'net/https'
module Net
class HTTP
alias_method :original_use_ssl=, :use_ssl=
def use_ssl=(flag)
self.ca_file = "/etc/pki/tls/certs/ca-bundle.crt" # for Centos/Redhat
self.verify_mode = OpenSSL::SSL::VERIFY_PEER
self.original_use_ssl = flag
end
end
end
注意:
许多操作系统已附带提供的证书包。 例如,在Red Hat Enterprise Linux和CentOS中,它安装在:
/etc/pki/tls/certs/ca-bundle.crt
对于Ubuntu来说:
/etc/ssl/certs/ca-certificates.crt
答案 2 :(得分:7)
在更新了在Yosemite上运行的Ruby后,我遇到了同样的问题,但在尝试通过Google进行身份验证时。
在此之后:https://toadle.me/2015/04/16/fixing-failing-ssl-verification-with-rvm.html
似乎解决了我的问题。
为了历史,我引用:
所以rvm安装的ruby会查找错误的证书目录,而OSX-ruby会查看正确的目录。在它的情况下是OSX系统目录。
所以rvm安装的ruby就是问题所在。
关于Github的讨论终于给出了解决方案:不知何故RVM附带了一个预编译版本的ruby,它与openssl静态链接,查看/ etc / openssl的证书。
你想做的不是使用任何预编译的红宝石,而是在本地机器上编译ruby,如下所示:rvm install 2.2.0 --disable-binary
最后,我不得不跑:
rvm uninstall ruby-2.2.4
rvm install ruby-2.2.4 --disable-binary
gem pristine --all
希望这有帮助
答案 3 :(得分:6)
看起来Facebook验证失败了。我不是OpenSSL大师,但我认为这对你有用。
假设你使用的是最新版本的OmniAuth(> = 0.2.2,我认为你是)和法拉第版本> = 0.6.1(堆栈跟踪说你是),您可以传递CA证书包的位置。相应地修改您的OmniAuth设置:
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, 'appid', 'appsecret', {:scope => 'publish_stream,email', :client_options => {:ssl => {:ca_path => '/etc/ssl/certs'}}}
# other providers...
end
并将'/etc/ssl/certs'
替换为捆绑包的路径。如果你需要一个,我相信this file会对你有用 - 只需将它放在某个地方,给它必要的权限,然后将你的应用指向它。
感谢Alex Kremer在this SO answer获取详细说明。
答案 4 :(得分:1)
此链接应该有效。 https://gist.github.com/fnichol/867550只需按照说明操作即可。您需要下载Rails安装程序并运行两个命令行函数。
答案 5 :(得分:0)
我刚刚做的一个丑陋的解决方法是覆盖Net :: HTTP中的类并设置变量,告诉它不验证ssl证书:
require 'net/http'
require 'openssl'
class Net::HTTP alias_method :origConnect, :connect
def connect
@ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
origConnect
end
end
我是这样做的,因为我不想使用调用gem的gem的源代码来调用调用Net :: HTTP的gem。我应该回过头来弄清楚如何轻推它来查看单独的cacert.pem文件。我无法修改服务器的cacert.pem文件,或者这是最好的路径。
答案 6 :(得分:0)
这样做,这将使用openssl
来获取证书错误sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem