Ruby on rails OpenSSL::SSL::SSLError:SSL\u connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书)

Ruby on rails OpenSSL::SSL::SSLError:SSL\u connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书),ruby-on-rails,ruby,openssl,Ruby On Rails,Ruby,Openssl,关于这一点有很多帖子。我看过这么多。所有的修复方案似乎都不起作用 (main)>贝宝::SDK::订阅::计划.all 请求[张贴]:https://api.sandbox.paypal.com/v1/oauth2/token Request.body=grant_type=client_credentials Request.header={“用户代理”=>“PayPalSDK/PayPal订阅Ruby SDK 0.3.1(PayPal SDK核心1.7.4;Ruby 2.6.6p146-x8

关于这一点有很多帖子。我看过这么多。所有的修复方案似乎都不起作用

(main)>贝宝::SDK::订阅::计划.all
请求[张贴]:https://api.sandbox.paypal.com/v1/oauth2/token
Request.body=grant_type=client_credentials Request.header={“用户代理”=>“PayPalSDK/PayPal订阅Ruby SDK 0.3.1(PayPal SDK核心1.7.4;Ruby 2.6.6p146-x86_64-linux;OpenSSL 1.1.1d 2019年9月10日)”,“内容类型”=>“应用程序/x-www-form-urlencoded”,“授权”=>“基本xxx”}
OpenSSL::SSL::SSLError:SSL\u connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书)
from/usr/local/lib/ruby/2.6.0/net/protocol.rb:44:in'connect\u nonblock'
我尝试过RVM2.6.6、2.7.0和Debian Buster系统ruby

我遵循了所有这些:

我运行了自动SSL检查,一切正常:

root@19ab47f15632:/usr/src/app#curl-Lks'https://git.io/rg-ssl|红宝石
以下是您的Ruby和OpenSSL环境:
Ruby:2.6.6p146(2020-03-31修订版67876)[x86_64-linux]
RubyGems:3.0.3
捆绑机:2.1.2
编译日期:OpenSSL 1.1.1d 2019年9月10日
加载版本:OpenSSL 1.1.1d 2019年9月10日
SSL证书文件:/usr/lib/SSL/CERT.pem
SSL\u CERT\u DIR:/usr/lib/SSL/certs
有了这些,让我们看看你是否可以连接到rubygems.org。。。
绑定器与rubygems.org的连接:成功✅
RubyGems与RubyGems.org的连接:成功✅
rubygems.org的RubyNet/http连接:成功✅

好极了这个Ruby可以连接到rubygems.org。你们都准备好使用Bundler和RubyGems了<我把这个留在这里,但是RIDIGRARES的答案是我认为的“正确”。这是处理这一长期问题的正确解决方案,尽管真正的解决方案是转向贝宝较新的创业板

我下面的答案是帮助您快速让PayPal重新工作,而无需对代码进行更新


这真的很难看,因为贝宝用他们的宝石包装证书。要启动并运行,您需要在包中找到gem,特别是找到文件“paypal.crt”。最后,您需要添加丢失的两个证书。我不打算在这里复制/粘贴它们,但它们很容易找到。实际上,它们已经出现在我的Ubuntu系统中的/etc/ssl/certs中:

DigiCert\u Global\u Root\u G2.pem

DigiCert\u High\u Assurance\u EV\u Root\u CA.pem

PayPal提供以下链接:

修复的步骤:

  • 在您正在使用的gem版本中查找paypal.crt文件。以下是我的感受:

    cd应用程序/制作/共享/捆绑

    找到-名称paypal.crt

    此时,我在gem的1.7.3和1.7.4版本中有一个文件。我使用的是1.7.4版本,所以我编辑了该文件

  • 将这两个证书添加到底部。您应该将证书的名称放在一行上,重复一行“=”以形成一个漂亮的分隔符,然后是整个证书,包括开始行和结束行

  • 重新启动应用程序


  • 这不是一个长期的解决方案,但会让您快速恢复运行。长期-升级到新的gem。

    以下是我们在我的团队中所做的工作

    我们添加了Michael在中提到的两个证书

     ssl_options:
        ca_file: config/api.paypal.com.crt
    
    然后在paypal.yml

    PayPal::SDK.configure(
      mode: ...,
      client_id: ...,
      client_secret: ...,
    
      # Deliberately set ca_file to nil so the system's Cert Authority is used,
      # instead of the bundled paypal.crt file which is out-of-date due to:
      # https://www.paypal.com/va/smarthelp/article/discontinue-use-of-verisign-g5-root-certificates-ts2240
      ssl_options: { ca_file: nil }
    )
    

    我们把宝石留在原处。最初,我们在gem中寻找答案,但最终我们保留了gem的原样,添加了crt并更新了yaml,如上图所示。

    可以通过使用服务器自己的CA文件来解决这个问题

    尝试设置
    ssl\u选项:{ca\u文件:nil}

    这会导致忽略与paypal sdk gem捆绑在一起的
    paypal.crt
    CA文件

    对于使用PayPal::SDK的应用程序。配置(…) 对于使用YAML配置文件的应用程序 在
    config/paypal.yml
    或配置文件所在的位置:

      ssl_options:
        ca_file: null
    

    如果您不使用
    PayPal::SDK.configure
    。在paypal.yml中添加

    module PayPal::SDK::Core::Util::HTTPHelper
      def default_ca_file
        nil # packaged CA file was out of date, use the system file
      end
    end
    

    由于PayPal已经改变了TLS,所以最简单(最快)的方法是作为monkey patch解决。此修补程序要求使用所有默认设置

    模块PayPal::SDK::Core
    模块Util
    模块HTTPHelper
    def配置\u ssl(http)
    http.tap do | https|
    https.use_ssl=true
    https.verify\u mode=OpenSSL::SSL::verify\u PEER
    添加证书(https)
    结束
    结束
    结束
    结束
    结束
    
    与@kritik类似但侵入性稍小的解决方案

    这仍然允许您更改初始值设定项中的其他SSL设置,并且仅删除默认CA文件


    您想在
    config/initializers
    中创建一个文件,并将上面的代码放入其中。

    是否使用?因为它依赖于已弃用且不再受支持的。这也可能是你麻烦的根源。(简短回答:不要使用不受支持和不推荐的工具)@anothermh不幸的是,这就是我正在使用的工具,如果它捆绑自己的证书,这是有意义的,这就是为什么系统证书是问题所在。直到最近,它才被弃用,而且目前还没有替代品。这是一个很难做到的地方。希望了解CERT可以引导您找到一种共同破解解决方案的方法。祝你好运谢谢你,迈克尔,我添加了一个答案,它是对你答案的一个小小扩展。这是一个很好的解决办法。我没有时间对它进行微妙的处理:)您可以通过将
    ca_file
    设置为
    nil
    来解决这个问题,因此使用服务器自己的ca文件。看答案好简单的解决方案!我在这里工作得很卖力,只是为了告诉大家两件事:1)它起作用了2)我们需要开始偿还技术债务……拯救了我的一天。。。。就我所能看到的最干净的解决方案。。。。
      ssl_options:
        ca_file: null
    
    module PayPal::SDK::Core::Util::HTTPHelper
      def default_ca_file
        nil # packaged CA file was out of date, use the system file
      end
    end