Heroku上的OpenSSL :: SSL :: SSLError [重复]
Posted
技术标签:
【中文标题】Heroku上的OpenSSL :: SSL :: SSLError [重复]【英文标题】:OpenSSL::SSL::SSLError on Heroku [duplicate] 【发布时间】:2012-07-27 01:39:31 【问题描述】:我正在尝试通过 Facebook 或 Twitter 对用户进行身份验证,让他们填写信息,然后单击保存(从而创建用户记录)。我在最后一步遇到 OpenSSL 错误——点击保存后。这发生在 Devise RegistrationsController#create 方法中。
所以我在 Heroku 上托管的 Rails 应用程序中遇到了这个错误:
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)
我见过很多解决方案,但都没有奏效。以下是我尝试过的一些事情:
1) 安装certified
gem
2) 将 Heroku gem 升级到 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
似乎一个问题可能是这个证书文件实际上并不存在——我在几个地方都看到过它,而且这似乎是 Heroku 的 ca_cert 文件的默认路径,但我可能是错了。
奇怪的是,这发生在之后我已经通过 FB/Twitter 进行了身份验证,并且正在尝试创建用户帐户。为什么会这样,我该如何解决/调试这个?真的很困惑。
更新:我将此行添加到 Omniauth 初始化程序,现在它“工作”了。因此,我诊断出问题出在 Omniauth 上。但是,我仍然希望进行 SSL 验证……这显然会留下安全漏洞。
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
【问题讨论】:
看看我下面的回答。它仍然保持验证。 @Simone Carletti 将此问题标记为重复,但事实并非如此。另一个问题是关于更新 Ruby Gems 的问题,这个问题是因为无法从 Heroku 调用第 3 方 https:// 服务。 【参考方案1】:经过一番搜索,我找到了:
如果您使用 Ruby 通过 https 打开与外部服务器的连接,例如。 Facebook Graph API,您可能会遇到以下错误:
OpenSSL::SSL::SSLError:SSL_connectreturned=1errno=0state=SSLv3readservercertificateB:certificateverifyfailed
此错误是由于 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
这应该会强制 ruby 使用应用程序 lib/ 目录中的 CA 包。
取自:http://jimneath.org/2011/10/19/ruby-ssl-certificate-verify-failed.html
更新:
您可能需要使用self.ca_path=
而不是self.ca_file=
,具体取决于您的系统。
【讨论】:
我试过了,但没有用。 .crt 文件如何保持最新? 您必须手动更新。如果您在 Heroku 上托管,我认为您可以使用他们的 CA 文件/usr/lib/ssl/certs/ca-certificates.crt
使用 /usr/lib/ssl/certs/ca-certificates.crt 在 Heroku 上为我工作 - 谢谢!
这适用于我在 Windows 7 上使用发布的确切代码。
我刚开始在 Heroku 上收到此错误 - 我的应用程序没有任何变化...我尝试使用 Pavel 的 self.ca_path 和 self.ca_file 解决方案以及证书的硬连线路径 - 不适用于我。我正在使用 ruby 1.9.3 和 Rails 3.2.12。 OpenSSL 版本是 OpenSSL 0.9.8k 25 Mar 2009。还有其他想法吗?【参考方案2】:
听起来您在 OmniAuth 中获得了正确的 openssl 配置,但您的 CA 证书路径可能不正确?
您可以通过运行在您的 Heroku 服务器上进行检查:
heroku run bash
...然后运行 openssl 以显示正确的路径:
$ openssl version -a
OpenSSL 1.0.0e 6 Sep 2011
OPENSSLDIR: "/usr/lib/ssl"
...您应该在 $OPENSSLDIR/certs/ca-certificates.crt 找到 ca_certificates.crt 文件
我会确认更新您的代码以匹配该路径。
【讨论】:
是的 ca-certificates 在那里...(在/usr/lib/ssl/certs
中)。感谢heroku run bash
.. 不知道这个
这是 Omniauth 需要的东西,还是每个外部请求?也许这就是问题所在……我正在发出另一个不起作用的外部请求?
是的,你能从你的日志中提供更多关于它在哪里引发 SSL 错误的上下文吗?也许是堆栈跟踪?
不幸的是,到目前为止,这就是它给我的一切,我会尝试将调试级别设置得更高,并让你知道。而且,请检查更新——这很有帮助。以上是关于Heroku上的OpenSSL :: SSL :: SSLError [重复]的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Windows 上的 /usr/local/ssl/openssl.cnf 加载配置信息
无法打开配置文件:Windows 上的 /usr/local/ssl/openssl.cnf [重复]