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


74

我正在尝试使用对OAuth到Google服务的签章。并得到这个错误:

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

遵循以下问题:

似乎解决方案是修复ca_path设置VERIFY_NONESSL

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

Windows / signet gem是否有解决方案?


我有同样的问题,只有paypal_adaptive宝石。有人找到答案吗?
wulftone

3
这个问题似乎仍然存在,而且我从未看过发生了什么的真正解释,而鄙视现有的许多hack和补丁。一个简单的外行人的解释将对帮助所有人大有帮助。
Nuby

我停止使用Signet并仅直接使用ruby OAuth gem解决了它
mbdev

只是一个FYI,我们暂时连接到存在证书问题的第三方服务器,因此我们不得IO.copy_stream( open( url, { ssl_verify_mode: OpenSSL::SSL::VERIFY_NONE } ), download_path )不仅禁用SSL验证。就我们而言,安全性不是问题,服务器不受控制,这是一个临时解决方案。
约书亚·品特

Answers:


189

实际上,我发现在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')
    

现在一切正常。


1
为什么我们要加入gmail.com?
ahnbizcad 2014年

2
仅供参考,当我与之合作librarian-chef下载厨师食谱时,我需要此厨师附带的证书:C:/opscode/chefdk/embedded/ssl/certs/cacert.pem
nebffa 2014年

1
对于Windows用户,请确保文件另存为“ cacert.pem”而不是“ cacert.pem.txt”。还遵循了针对Windows的Ruby上的替代方法RubyGems的SSL错误(RubyInstaller)
Sudarsan GP

12
不要这样 安装通过HTTP(不是HTTPS)下载的随机证书作为完全受信任的根证书只是在麻烦。没关系,答案后面建议的库也以不安全而闻名。
马修·辛克尔

2
@DevDude几个月前,此解决方案开始工作。在我最近进行Windows更新之后,我的台式机和笔记本电脑都不再起作用= /有任何想法吗?
卡莫(Ka Mok)2016年

27

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 hash_else_provider行而不使用client_options hash_end


3
通过HTTP下载证书是一个糟糕的主意。
Zigg 2015年

21

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

两个简单步骤:

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

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

而已。


先生,你是冠军!请注意,您应该certified-update.bat不时使用该文件以使证书保持最新状态。

Ruby noob在这里-当您说“在rb文件中”时,您指的是确切的文件?这是boot.rb文件吗?
jbyrd


8

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

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

而且现在看来工作正常。但是不要用这个来生产


2
我赞赏“请勿在生产中使用此功能”,但我觉得应该大写,突出,重复,强调和重申。给定下面的答案,我觉得这个答案应该删除。
oreoshake 2015年

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

1

添加到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下载证书,则可能会遭受MITM攻击。
马修·辛克尔

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

第4步-现在安全地卸载rubygems-update gem

gem uninstall rubygems-update -x

步骤5尝试再次安装滑轨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. 您应该会收到一条消息“导入成功”


0

https://curl.haxx.se/ca/cacert.pem保存cacert.pmp文件,然后将此文件添加到yourruby安装文件夹\ lib \ ruby​​ \ 2.3.0 \ ruby​​gems \ ssl_certs

例如:C:\ Ruby23 \ lib \ ruby​​ \ 2.3.0 \ ruby​​gems \ ssl_certs


0

这对我有帮助: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')

希望这会有所帮助。


0

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


-3

对于使用滑轨的人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}} }

2
{:ssl => {:verify => false}}不是解决方案,只会带来另一个问题。
oreoshake 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.