如何摆脱OpenSSL :: SSL :: SSLError

Eug*_*ene 31 facebook ruby-on-rails 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

RAJ*_*RAJ 20

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

   require 'openssl'
   OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Run Code Online (Sandbox Code Playgroud)

  • 这不应被视为一种选择.正确修复它或者甚至不使用SSL. (22认同)
  • 如上所述,这仅用于调试或开发.请勿在生产中使用此代码. (3认同)
  • 我绝对认为在你的回答中你应该包括为什么这是非常不安全的。 (2认同)

Ama*_*r S 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
Run Code Online (Sandbox Code Playgroud)

注意:

许多操作系统已附带提供的证书包.例如,在Red Hat Enterprise Linux和CentOS中,它安装在:

/etc/pki/tls/certs/ca-bundle.crt
Run Code Online (Sandbox Code Playgroud)

对于Ubuntu来说:

/etc/ssl/certs/ca-certificates.crt
Run Code Online (Sandbox Code Playgroud)

  • config/initializers目录位于您的Rails应用程序文件夹结构下.此解决方案适用于Rails应用程序. (2认同)
  • 对我来说,在 redhat `export SSL_CERT_FILE='/etc/pki/tls/certs/ca-bundle.crt'` 中设置环境变量就足够了 (2认同)

rpb*_*zar 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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助


Mic*_*ley 6

看起来SSL的验证失败了.我不是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
Run Code Online (Sandbox Code Playgroud)

并替换'/etc/ssl/certs'为捆绑的路径.如果你需要一个,我相信这个文件对你有用 - 只需把它放在某个地方,给它必要的权限,并指向你的应用程序.

感谢Alex Kremer在此SO答案中获取详细说明.