33

我正在尝试使用 OmniAuth 对 Facebook 用户进行身份验证。最初,它正在工作,但在此过程中它只是停止工作并开始给我这个错误消息:

OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

相同的代码适用于 Twitter,但我似乎无法理解为什么它不适用于 Facebook。我在网上寻求帮助,但我没有成功。

这是我正在构建的网站的链接:http
://www.bestizz.com/ 这个网址会给你错误信息:http ://www.bestizz.com/auth/facebook

4

7 回答 7

25

Ruby 找不到任何根证书。这是用于调试目的的选项。将以下代码放在脚本的开头:

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
于 2012-08-20T06:11:33.373 回答
9

将以下代码添加到 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
于 2012-08-01T05:22:17.617 回答
7

更新在优胜美地上运行的 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 的证书。

你想要做的是不要使用任何预编译的红宝石,而是在你的本地机器上编译红宝石,如下所示: rvm install 2.2.0 --disable-binary

最后,我不得不运行:

rvm uninstall ruby-2.2.4
rvm install ruby-2.2.4 --disable-binary
gem pristine --all

希望这可以帮助

于 2016-03-18T03:21:26.437 回答
6

Facebook 的 SSL 验证似乎失败了。我不是 OpenSSL 大师,但我认为这应该适合你。

假设您使用的是最新版本的 OmniAuth(>= 0.2.2,我假设您是)和 Faraday >= 0.6.1 的版本(堆栈跟踪显示您是),您可以传递位置您的 CA 证书捆绑包。相应地修改 Facebook 的 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'为您的捆绑包的路径。如果你需要,我相信这个文件对你有用——只要把它放在某个地方,给它必要的权限,然后把你的应用程序指向它。

感谢 Alex Kremer 在这个 SO 答案中的详细说明。

于 2011-04-21T14:50:01.880 回答
1

这个链接应该可以工作。https://gist.github.com/fnichol/867550只需按照说明操作即可。您将需要下载 Rails 安装程序并运行两个命令行函数。

于 2014-03-11T00:46:01.853 回答
0

这样做,这将通过 openssl 解决证书错误

sudo curl http://curl.haxx.se/ca/cacert.pem -o /opt/local/etc/openssl/cert.pem
于 2011-10-12T05:25:25.617 回答
0

我刚刚做的一个丑陋的解决方法是覆盖 Net::HTTP 中的类并设置告诉它不验证 ssl 证书的变量:

    require 'net/http'
    require 'openssl'

    class Net::HTTP   
        alias_method :orig_connect, :connect

        def connect
          @ssl_context.verify_mode = OpenSSL::SSL::VERIFY_NONE
          orig_connect
        end
    end

我这样做是因为我不想弄乱调用调用 Net::HTTP 的 gem 的 gem 的源代码。我真的应该回去弄清楚如何轻推它以查看单独的 cacert.pem 文件。我无法修改服务器的 cacert.pem 文件,否则这将是最佳途径。

于 2011-06-30T11:24:06.850 回答