【问题标题】:How to solve "certificate verify failed" on Windows?如何解决 Windows 上的“证书验证失败”?
【发布时间】:2011-08-08 21:27:56
【问题描述】:

我正在尝试将 signet 用于 Google 服务的 OAuth。并得到这个错误:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

以下问题:

似乎解决方案是修复 ca_path为 SSL 设置 VERIFY_NONE

发布的ca_path 修复仅适用于Linux(端口安装),VERIFY_NONE 的修复似乎适用于法拉第。

是否有适用于 Windows/signet gem 的解决方案?

【问题讨论】:

  • 我遇到了同样的问题,只有paypal_adaptive gem。有人找到答案吗?
  • 问题似乎仍然存在,而且我从未见过对正在发生的事情的真正解释,鄙视存在的许多黑客和补丁。一个简单的外行的解释将大大帮助每个人。
  • 我通过停止使用 signet 并直接使用 ruby​​ OAuth gem 解决了这个问题
  • 仅供参考,我们临时连接到存在证书问题的第 3 方服务器,因此我们不得不使用 IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path ) 来禁用 SSL 验证。在我们的案例中,安全不是问题,服务器超出了我们的控制范围,这是一个临时解决方案。

标签: ruby-on-rails ssl


【解决方案1】:

是的,我已将 initializers 文件夹中的 omniouth.rb 文件设置为:

provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:verify => false}}}

现在这似乎工作正常。但请勿将其用于生产

【讨论】:

  • 我很欣赏“不要在生产中使用它”,但我觉得它应该全部大写,突出显示、重复、强调和重申。鉴于下面的答案,我觉得应该删除这个答案。
【解决方案2】:

Windows 解决方案,我从几个不同的答案拼凑而成:

  1. 下载https://curl.haxx.se/ca/cacert.pem并将其放入YOUR_APP/lib/assets(或任何位置)
  2. config/initializers/omniauth.rb 中:

     #config/initializers/omniauth.rb
    Rails.application.config.middleware.use OmniAuth::Builder do
      provider :facebook, CUSTOMER_KEY, CUSTOMER_SECRET, {client_options: {ssl: {ca_file: Rails.root.join('lib/assets/cacert.pem').to_s}}}
    end
    
  3. 显然,重启你的服务器。

脚注: 您也许可以在 cacert.pem 文件中删除许多不必要的证书以减小大小。如果您只需要此解决方案进行开发,您可以将文件保存在项目之外并使用 client_options hash_ else _provider 行而不使用 client_options hash_ end 执行end _provider 行

【讨论】:

  • 通过 HTTP 下载证书是个糟糕的主意。
【解决方案3】:

实际上,我发现在 Windows 中为 Ruby 本身解决这个问题的最佳方法,而不仅仅是一个 gem,是执行以下操作:

  1. https://curl.haxx.se/ca/cacert.pem 下载到c:\railsinstaller\cacert.pem。确保将其保存为 .pem 文件,而不是文本文件。
  2. 转到您的计算机 -> 高级设置 -> 环境变量
  3. 创建一个新的系统变量:

    变量:SSL_CERT_FILE 值:C:\RailsInstaller\cacert.pem

  4. 关闭所有命令提示符,包括 Rails 服务器命令提示符等。

  5. 启动一个新的 ruby​​ irb 提示符,然后尝试以下操作:

    $irb>require 'open-uri'
    $irb>open('https://www.gmail.com')
    

现在应该一切正常。

【讨论】:

  • 我们为什么要写 gmail.com?
  • 仅供参考,当我与下载厨师食谱的 librarian-chef 合作时,我需要这个厨师随附的证书:C:/opscode/chefdk/embedded/ssl/certs/cacert.pem
  • 对于 Windows 用户,确保文件保存为“cacert.pem”而不是“cacert.pem.txt”。还关注了Workaround RubyGems' SSL errors on Ruby for Windows (RubyInstaller)
  • 不要这样做。安装通过 HTTP(不是 HTTPS)下载的随机证书作为完全受信任的根证书只是自找麻烦。没关系,答案后面建议的库也以不安全而闻名。
  • @DevDude 这个解决方案几个月前就开始工作了。在最近对我的台式机和笔记本电脑进行 Windows 更新后,这不再适用 =/ 有什么想法吗?
【解决方案4】:

对于使用 rails 4 的人。

在devise.rb中添加这个

require "omniauth-google-oauth2"
config.omniauth :google_oauth2, "CLIENT_ID", "CLIENT_SECRET", { access_type: "offline", approval_prompt: "", :client_options => {:ssl => {:verify => false}} }

【讨论】:

  • {:ssl => {:verify => false}} 不是解决方案,它只会造成另一个问题。
【解决方案5】:

添加到 DevDude 的解决方案,但使用 Windows Powershell:

下载http://curl.haxx.se/ca/cacert.pem到c:\railsinstaller\cacert.pem

在 powershell 提示符下:

$env:SSL_CERT_FILE = 'c:\RailsInstaller\cacert.pem'

然后我能够成功运行gem update

注意:您可以简单地在您的配置文件 notepad $profile 中定义该环境变量

【讨论】:

  • 通过 SSL 下载证书 not 会使您面临 MITM 攻击。
【解决方案6】:

更新 ruby​​gems 包管理框架为我在 Windows 7 上解决了这个问题。

https://rubygems.org/pages/download

gem update --system          # may need to be administrator or root

【讨论】:

  • 这在 Windows 8.1 上为我解决了这个问题。拥有 gem 版本 1.8.28 并升级到 2.4.5 (ruby 1.9.2)。
【解决方案7】:

通过将证书导入为受信任的机构,我能够消除上述 PATH 或 SYSTEM VARIABLE 设置。

  1. 调用 certmgr.msc
  2. 右键单击受信任的根证书颁发机构文件夹。
  3. 选择“所有任务”
  4. 选择“导入”
  5. 在文件类型下拉列表中选择所有文件,然后选择 cacert.pem 文件。
  6. 您应该会收到一条消息“导入成功”

【讨论】:

    【解决方案8】:

    经过大量搜索和浪费时间,我找到了一个非常简单的解决方案,可以在 Ruby with Windows 中解决此问题。

    两个简单的步骤:

    1. 在命令提示符下写:C:\gem install certified

    2. 在您的rb 文件中添加:require 'certified'

    就是这样。

    【讨论】:

    • 你先生,是冠军!请注意,您应该不时使用certified-update.bat 文件以使证书保持最新状态。
    • Ruby noob here - 当您说“在您的rb 文件中”时,您指的是哪个文件?这是boot.rb 文件吗?
    • 我的意思是你的 ruby​​ 文件或扩展名为 rb 的脚本,它应该包括以下行:require 'certified'
    【解决方案9】:

    我相信正确的答案是更新您的 gem 安装程序:rubygems-update。为何需要这样做的解释见:Ssl Certificate Updates

    【讨论】:

      【解决方案10】:

      进入 ruby​​gems-update 下载页面:https://rubygems.org/gems/rubygems-update

      单击下载链接,您将下载一个名为 ruby​​gems-update-2.6.7.gem 的文件。在命令行中,导航到您将 .gem 文件下载到的目录并键入:

      gem install rubygems-update-2.6.7.gem
      

      (或任何文件名,如果是较新版本)

      然后输入:

      update_rubygems
      

      您可以通过以下方式验证它是否已更新:

      gem --version
      

      【讨论】:

        【解决方案11】:

        使用 http:// URL 而不是 https:// 让您更轻松

        在 ruby​​ 命令行中使用以下命令将 gem 源更改为 http://rubygems.org/

        gem sources -a http://rubygems.org/
        

        【讨论】:

          【解决方案12】:

          https://curl.haxx.se/ca/cacert.pem 保存您的 cacert.pmp 文件,然后将此文件添加到您的 ruby​​-installation 文件夹\lib\ruby\2.3.0\rubygems\ssl_certs 位置

          例如:C:\Ruby23\lib\ruby\2.3.0\rubygems\ssl_certs

          【讨论】:

            【解决方案13】:

            我在 Windows 机器上尝试设置 rails 5 时遇到了这个错误,结果我必须将 ruby​​gem 版本更新到 2.6.7,然后它才能工作。

            第 1 步从下方下载 ruby​​gem

            https://rubygems.org/downloads/rubygems-update-2.6.7.gem
            

            第 2 步 - 通过指向下载的 ruby​​gems 进行安装

            gem install --local C:\rubygems-update-2.6.7.gem
            

            第 3 步 - 检查新版本是 2.6.7

            gem --version
            

            第 4 步 - 现在安全地卸载 ruby​​gems-update gem

            gem uninstall rubygems-update -x
            

            第 5 步尝试再次安装 rails 5

            gem install rails --version 5.0.0
            

            工作就像一个魅力!

            我从以下渠道获得信息: http://guides.rubygems.org/ssl-certificate-update/#installing-using-update-packages

            【讨论】:

              【解决方案14】:

              这对我有帮助: https://coderwall.com/p/ubl6iw/fix-ssl_connect-returned-1-errno-0-state-sslv3-read-server-certificate-b-certificate-verify-failed-openssl-ssl-sslerror 我的 ruby​​ on rails 项目正在内部将数据发布到 api,它无法验证内部证书。 这些行有帮助:

              require 'https'
              
              http = Net::HTTP.new('example.com', 443)
              http.use_ssl = true
              http.verify_mode = OpenSSL::SSL::VERIFY_PEER
              
              http.cert_store = OpenSSL::X509::Store.new
              http.cert_store.set_default_paths
              http.cert_store.add_file('/path/to/internal.cert.pem')
              

              希望这能有所帮助。

              【讨论】:

                【解决方案15】:

                我在安装旧版 ruby​​ 时也遇到了这个问题。当我安装最新的 Ruby 版本时,这个问题就消失了。所以基本上需要更新 SSL 证书。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-07-03
                  • 2019-09-15
                  • 1970-01-01
                  • 2012-03-15
                  • 2016-04-19
                  • 2023-03-14
                  相关资源
                  最近更新 更多