PayPal API SSL 问题 - 刚刚开始

Posted

技术标签:

【中文标题】PayPal API SSL 问题 - 刚刚开始【英文标题】:PayPal API SSL Issue - just started 【发布时间】:2020-12-04 15:37:59 【问题描述】:

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

错误报告为: ''' 会员资格中发生 OpenSSL::SSL::SSLError#pay_renewal:

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

我不知道从哪里开始。

应用程序正在运行 Ruby on Rails v6.0.2,使用 paypal-sdk-rest gem (v 1.7.4),并在 Amazon EC2 Redhat 实例上运行。

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

【问题讨论】:

【参考方案1】:

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

Paypal 文章中提到:https://www.paypal.com/us/smarthelp/article/migration-to-digicert-root-certificates-ts2240

在此处从 Digicert 下载“DigiCert High Assurance EV Root CA”和“DigiCert Global Root G2”证书:

https://www.digicert.com/kb/digicert-root-certificates.htm

另外,下载您要调用的所有 Paypal API 的证书:

https://www.paypal.com/us/smarthelp/article/ts1510

(就我而言,我只使用 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 下,类似于 PayPal-Ruby-SDK 存储它的位置。

现在您可以修改 SDK 以使用您的 paypal.crt 文件,而不是 SDK 中提供的过期文件,方法是在您初始化 PayPal SDK 之前的某处添加以下 sn-p:

# 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 站点下载所有证书)

【讨论】:

【参考方案2】:

您的怀疑是正确的,请确保您信任 DigiCert 根(High Assurance EV 和 Global G2),因为最近为 api.paypal.com 设置了截止日期——为此发送了许多通知

这里有一些细节:https://www.paypal.com/us/smarthelp/article/migration-to-digicert-root-certificates-ts2240

【讨论】:

谢谢。我已经下载了证书,在 RedHat EC2 上安装时,它警告说它们是重复的,所以看起来它们已经安装了。 是的,它们没有被代码路径使用并给出错误 我已经找到了 ruby​​ gem 在哪里安装了它自己的 Digi... 证书并替换了它们。我还注释掉了 gem 中包含的 paypal.crt 文件的使用。因此,我们的系统现在再次链接到 PayPal。不幸的是,gem 已被弃用,所以我必须分叉它并进行一些本地更改。感谢您的指点 - 非常有用:-) 未来(嗯,实际上是现在)是在两条路线中使用的 v2 Checkout-Ruby-SDK,一种用于“设置事务”,另一种用于“捕获事务”,记录在这里:developer.paypal.com/docs/checkout/reference/server-integration ,并与此前端 UI 配对,使您的网站保持加载(无重定向):developer.paypal.com/demo/checkout/#/pattern/server

以上是关于PayPal API SSL 问题 - 刚刚开始的主要内容,如果未能解决你的问题,请参考以下文章

我的 PayPal 脚本突然停止验证 SSL 证书

PayPal API 的“无可用协议”SSL 问题

Paypal REST API 沙盒 - SSL 连接错误

PayPal API,HttpWebRequest 抛出 SSL WebException

TLS 1.2 升级 errno 54 后 PayPal 沙箱 API SSL 错误

GoDaddy PayPal API 警报握手失败