如何在Windows上解决“证书验证失败”的问题?

75

我正在尝试使用Signet进行OAuth授权访问Google服务,但出现如下错误:

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

针对以下问题:

看起来解决方案是修复 ca_path 或者在 SSL 中设置 VERIFY_NONE

在 Linux 上修复的 ca_path 只适用于端口安装,而解决 VERIFY_NONE 的方法似乎只适用于 Faraday。

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


我遇到了同样的问题,只是与 paypal_adaptive gem 有关。有人找到答案了吗? - wulftone
3
问题似乎一直存在,尽管有许多黑客和补丁,但我从未看到真正的解释发生了什么。一个简单的普通人的解释会对帮助大家产生很大作用。 - Nuby
我解决了这个问题,通过停止使用 signet 并直接使用 Ruby OAuth gem。 - mbdev
只是提醒一下,我们暂时连接到一个有证书问题的第三方服务器,所以我们不得不使用 IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path ) 来禁用 SSL 验证。在我们的情况下,安全性不是问题,服务器不受我们控制,这只是一个临时解决方案。 - Joshua Pinter
15个回答

192

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

  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')
    

现在一切都应该正常工作了。


1
我们为什么要打开gmail.com? - ahnbizcad
2
顺便提一下,当我在使用 librarian-chef 下载 Chef cookbook 时,我需要使用附带 Chef 的此证书:C:/opscode/chefdk/embedded/ssl/certs/cacert.pem - nebffa
1
对于 Windows 用户,请确保文件保存为 "cacert.pem" 而不是 "cacert.pem.txt"。此外,还要按照 在 Windows 上解决 RubyGems 在 Ruby 中的 SSL 错误 (RubyInstaller) 进行操作。 - Sudarsan GP
14
不要这样做。将通过HTTP(而非HTTPS)下载的随机证书安装为完全信任的根证书只会招惹麻烦。更不用说答案后面提到的该库也因存在漏洞而闻名了。 - Matthew Schinckel
2
@DevDude 这个解决方案几个月前还能用。最近我电脑和笔记本电脑都进行了Windows更新,但现在无法使用=/ 有什么想法吗? - Ka Mok
显示剩余6条评论

28

以下是我从stackoverflow获取的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 文件中的许多不必要的证书来减少文件大小。如果你只需要这个解决方案用于开发,你可以将该文件保存在项目之外,并使用 if Rails.env.development? _提供程序行和 client_options 哈希_ else _提供程序行没有 client_options 哈希_ end 语句块。


4
使用HTTP下载证书是一个糟糕的想法。 - zigg

21

在搜索和浪费了太多时间之后,我发现了一个非常简单的解决方案,用于修复Ruby在Windows上的问题。

只需要两个简单的步骤:

  1. 在命令提示符中输入:C:\gem install certified

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

就这样。


1
你是个冠军!请注意,您应该偶尔使用certified-update.bat文件以保持证书最新。 - user427390
我是一名Ruby新手-当你说“在你的'rb'文件中”时,你指的是哪个文件?这是指“boot.rb”文件吗? - jbyrd
我的意思是在你的Ruby文件或扩展名为rb的脚本中,应包含以下行:require 'certified' - Abdelrahman Farag

9

是的,我已经将initializers文件夹中的omniouth.rb文件设置为以下内容:

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

现在看来这似乎可以正常工作。但是不要在生产环境中使用此方法


2
我很欣赏“不要在生产环境中使用”的提醒,但我觉得它应该用大写字母、高亮、重复、强调和反复强调。根据下面的答案,我觉得这个答案应该被删除。 - oreoshake

9

在Windows 7上,更新rubygems软件包管理框架可以解决这个问题。

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)。 - Ciryon

5

使用http:// URL而不是https://可以更轻松地完成此操作

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

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

2

请前往rubygems-update下载页面:https://rubygems.org/gems/rubygems-update

点击下载链接,您将下载一个名为rubygems-update-2.6.7.gem的文件。在命令行中,进入您下载.gem文件的目录,然后键入:

gem install rubygems-update-2.6.7.gem

(如果有新版本)或者文件名,然后输入:

update_rubygems

您可以使用以下方法验证其是否已更新:
gem --version

2

在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


2
下载证书时不通过SSL打开,会使您暴露于中间人攻击的威胁之下。 - Matthew Schinckel

1
我在尝试在Windows机器上安装Rails 5时遇到了这个错误,后来发现我需要将rubygem版本更新到2.6.7,然后它才能正常工作。
步骤1:从以下链接下载rubygem。
https://rubygems.org/downloads/rubygems-update-2.6.7.gem

步骤2 - 通过指向下载的RubyGems进行安装

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

步骤3 - 检查新版本是否为2.6.7。
gem --version

步骤四 - 现在安全卸载rubygems-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


0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接