Heroku上的OpenSSL :: SSL :: SSLError

var*_*tis 20 openssl ruby-on-rails heroku omniauth

我正在尝试通过Facebook或Twitter对用户进行身份验证,让他们填写他们的信息,然后单击"保存"(从而创建用户记录).我在最后一步得到一个OpenSSL错误 - 点击保存后.这发生在Devise RegistrationsController #create方法中.

所以我在我的Rails应用程序中收到此错误,在Heroku上托管:

2012-07-28T18:25:13+00:00 app[web.1]: OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed)
Run Code Online (Sandbox Code Playgroud)

我见过很多解决方案,但都没有.以下是我尝试过的一些事情:

1)安装certified宝石

2)将Heroku宝石升级到v2.30,再次推动

3)这个:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, TWITTER_KEY, TWITTER_SECRET, {:client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
  provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:scope => "publish_actions,user_location,email", :client_options => {:ssl => {:ca_file => "/usr/lib/ssl/certs/ca-certificates.crt"}}}
end
Run Code Online (Sandbox Code Playgroud)

似乎有一个问题可能是这个证书文件实际上并不存在 - 我已经在几个地方看到了它,而且看起来这是Heroku的ca_cert文件的默认路径,但我可能是错的.

奇怪的是,这是我通过FB/Twitter进行身份验证之后发生的,并且我正在尝试创建用户的帐户.为什么会这样,我该如何解决/调试呢?真诚的困惑.

更新:我将此行添加到Omniauth初始化程序,现在它"正常".因此,我已经诊断出问题出在Omniauth上.但是,我还想进行SSL验证......这显然会留下安全漏洞.

OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

Pav*_*lov 40

经过一些搜索后,我找到了:

如果您使用Ruby通过https打开与外部服务器的连接,例如.Facebook Graph API,您可能会遇到以下错误:

OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv3readservercertificateB:certificateverifyfailed
Run Code Online (Sandbox Code Playgroud)

此错误是由于Ruby无法找到用于验证安全Web服务器的真实性的证书颁发机构证书(CA Certs).解决方案是将此ca-bundle.crt下载到您的应用程序lib/目录中:然后将以下代码添加到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 = Rails.root.join('lib/ca-bundle.crt').to_s
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这应该强制ruby使用应用程序的lib /目录中的CA bundle.

摘自:http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html

更新:

您可能需要使用self.ca_path=而不是self.ca_file=依赖于您的系统.

  • 你必须手动保持它是最新的.如果您在Heroku上托管我认为您可以使用他们的CA文件`/ usr/lib/ssl/certs/ca-certificates.crt` (3认同)
  • 使用/usr/lib/ssl/certs/ca-certificates.crt在Heroku上为我工作 - 谢谢! (2认同)

Win*_*eld 7

听起来你在OmniAuth中有正确的openssl配置,但是你的CA证书路径可能不正确?

您可以通过运行以下命令在heroku服务器上检查:

heroku run bash
Run Code Online (Sandbox Code Playgroud)

...然后运行openssl以显示正确的路径:

$ openssl version -a
OpenSSL 1.0.0e 6 Sep 2011
OPENSSLDIR: "/usr/lib/ssl"
Run Code Online (Sandbox Code Playgroud)

...您应该在$ OPENSSLDIR/certs/ca-certificates.crt中找到ca_certificates.crt文件

我会确认该路径更新您的代码以匹配.