【问题标题】:Rails/Ubuntu: SSLv3 read server certificate B: certificate verify failedRails/Ubuntu:SSLv3 读取服务器证书 B:证书验证失败
【发布时间】:2018-03-07 10:06:07
【问题描述】:

两天前,我开始在我的应用程序的生产服务器上看到此错误(在暂存时一切正常)。我在这里找到了很多关于 SO 的主题,但没有一个为我解决了这个问题。

这是导致此错误消息的一段代码:

  @client = Savon.client(wsdl: wsdl_url)
  #@client = Savon.client(wsdl: wsdl_url, ssl_verify_mode: :none) # this sovles the problem, but I don't want to skip the verification 

在 SO 上,我还发现一个可能的解决方案可能是创建一个初始化文件并将以下内容放在那里:

require 'open-uri'
require 'net/https'

module Net
  class HTTP
    alias_method :original_use_ssl=, :use_ssl=

    def use_ssl=(flag)
      #self.ca_path = Rails.root.join('lib/ca-bundle.crt').to_s
      self.ssl_version = :TLSv1_2 # added
      self.ca_file = '/etc/ssl/certs/ca-certificates.crt' # the file exists
      self.verify_mode = OpenSSL::SSL::VERIFY_PEER
      self.original_use_ssl = flag
    end
  end
end

但不幸的是,这并没有解决错误。我还尝试在生产 Ubuntu (14.04) 服务器上重新安装证书

sudo apt-get install openssl ca-certificates

包已经升级了,可惜错误还在。

任何提示我可以做些什么来摆脱错误?

编辑:我应该如何或从哪里开始调试?

【问题讨论】:

  • 我建议您使用 OpenSSL CLI 工具检查服务器证书,如下所示:openssl s_client -connect example.com:443 您要连接的主机的证书实际上可能无效(即已过期)。

标签: ruby-on-rails ruby ssl certificate savon


【解决方案1】:

运行openssl s_client -showcerts -connect server_you_are_connecting_to.com:443 并检查证书。在此之后,您应该会发现自己处于以下情况之一:

  1. 证书有效(具有有效的到期日期和公用名),但它是由不受您的系统信任的证书颁发机构 (CA) 签署的。如果是这种情况,您需要将 CA 的证书添加到受信任的商店或更新系统上的 ca-bundle 包。

  2. 证书无效(已过期或公用名错误)。如果禁用对等 SSL 证书验证不是您的选项,那么您可以实现自己的证书验证回调,例如描述 here - 在这种情况下,代码将不依赖于系统的受信任存储,而是检查对等服务器是否使用特定证书。

希望这会有所帮助。

【讨论】:

  • 谢谢 - 我运行了命令,但它没有显示任何证书 - 这是输出:gethostbyname failure connect:errno=0
  • @user984621 似乎是网络问题,而不是 SSL 问题。您确定您在命令中使用了正确的主机名吗?
【解决方案2】:

几天前我也开始收到此错误。

删除 geocoder 解决了这个问题。

根据 Heroku 支持,有时当外部提供商更改其 SSL 配置时会发生这些错误。

回复评论:

日志中没有具体说明地理编码器,但我在错误报告(通过异常通知器 gem)中看到应用程序在向地理编码器发出请求时崩溃,并出现此错误。

我还对用户模型进行了回调,并注意到应用程序在用户保存/更新时崩溃。

我猜是幸运的。

【讨论】:

  • 感谢您的回复。你怎么知道问题出在geocoder?你在日志中看到了吗(我没有看到任何东西)?
  • 添加了对我的回答的回复。
猜你喜欢
  • 2014-05-01
  • 2017-08-06
  • 2012-09-26
  • 2011-05-30
相关资源
最近更新 更多