如何摆脱OpenSSL :: SSL :: SSLError

时间:2011-04-19 03:12:30

标签: ruby-on-rails facebook omniauth omniauth-facebook

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

  

OpenSSL :: SSL :: SSLError SSL_connect   返回= 1 errno = 0状态= SSLv3读取   服务器证书B:证书   验证失败

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

这是我正在建设的网站的链接:http://www.bestizz.com/
此网址会显示错误消息:http://www.bestizz.com/auth/facebook

7 个答案:

答案 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