Ruby on rails PayPal API SSL问题-刚刚开始

Ruby on rails PayPal API SSL问题-刚刚开始,ruby-on-rails,paypal,ssl-certificate,Ruby On Rails,Paypal,Ssl Certificate,我们刚开始在生产系统上处理PayPal付款时收到以下错误。 我们的系统最近没有更新,所以问题不是我们的代码库 错误报告为: ''' 在会员资格#支付#续订中发生OpenSSL::SSL::SSLError错误: SSL_connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书) ''' 我不知道从哪里开始 该应用程序正在运行RubyonRailsV6.0.2,使用PayPalSDK RESTGem(V1.7.4),并在AmazonEC2RedHat实例上运行

我们刚开始在生产系统上处理PayPal付款时收到以下错误。 我们的系统最近没有更新,所以问题不是我们的代码库

错误报告为: ''' 在会员资格#支付#续订中发生OpenSSL::SSL::SSLError错误:

SSL_connect返回=1 errno=0 state=错误:证书验证失败(无法获取本地颁发者证书) '''

我不知道从哪里开始

该应用程序正在运行RubyonRailsV6.0.2,使用PayPalSDK RESTGem(V1.7.4),并在AmazonEC2RedHat实例上运行


我怀疑这与我们的服务器上需要安装的新证书有关。

您的怀疑是正确的,请确保您信任DigiCert根(High Assurance EV和Global G2),因为api.paypal.com最近被切断了连接——为此发送了许多通知


此处有一些详细信息:

对于那些正在寻找即时解决方案的人,在@preston phx和@houdi提供的信息的基础上,这里有更多的技术细节:

正如Paypal文章中提到的:

从DigiCert下载“DigiCert高保证EV根CA”和“DigiCert全局根G2”证书:

此外,还可以从以下站点下载所有Paypal API的证书:

(就我而言,我只使用api.paypal.com,所以我下载了api.paypal.com.pem和api.sandbox.paypal.com.pem)

这些将为您提供一组pem文件,如:

DigiCertGlobalRootG2.crt.pem
DigiCertHighAssuranceEVRootCA.crt.pem
api.paypal.com.pem
api.sandbox.paypal.com.pem
将所有文件合并到单个paypal.crt文件中,如下所示:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
...
将文件放在项目中的某个位置。我把它放在
data/paypal.crt
下,类似于PaypalRuby SDK存储它的地方

现在,您可以通过在初始化paypal SDK之前的某个地方添加以下代码片段,对SDK进行修补,以使用您的paypal.crt文件,而不是SDK中提供的ouut日期文件:

# Monkey patch the paypal certificate file
PayPal::SDK::Core::Util::HTTPHelper.class_eval do
  def default_ca_file
    File.expand_path("../../data/paypal.crt", __dir__)
  end 
end
我使用的是Rails,所以我直接将其添加到config/initializers/paypal.rb文件的顶部


(我不提供证书或证书本身的任何直接链接,因为您永远不应该信任第三方提供的任何证书。直接从PayPal和Digicert网站下载所有证书)

谢谢。我已经下载了证书,当在RedHat EC2上安装时,它警告说它们是重复的,所以看起来它们已经安装好了。是的,它们没有被代码路径使用,所以出现了错误。我已经找到了ruby gem安装自己的Digi。。。证书,并将其替换。我还注释了gem中包含的paypal.crt文件的使用。因此,我们的系统现在再次链接到贝宝。不幸的是,gem已被弃用,因此我将不得不放弃它并进行一些本地更改。感谢您的指点-非常有用:-)未来(实际上是现在)是v2 Checkout Ruby SDK,用于两种路径,一种用于“设置事务”,另一种用于“捕获事务”,记录在此处:,并与此前端UI配对,使您的站点保持加载状态(无重定向):