PayPal API SSL 问题 - 刚刚开始

Hou*_*udi 3 paypal ruby-on-rails ssl-certificate

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

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

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

我不知道从哪里开始。

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

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

小智 5

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

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

从此处下载“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
Run Code Online (Sandbox Code Playgroud)

将所有文件合并到一个 paypal.crt 文件中,该文件如下所示:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
...
Run Code Online (Sandbox Code Playgroud)

将文件放在项目中的某个位置。我把它放在data/paypal.crt类似于 PayPal-Ruby-SDK 存储它的位置。

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

# 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
Run Code Online (Sandbox Code Playgroud)

我正在使用 Rails,因此我将其直接添加到我的 config/initializers/paypal.rb 文件的顶部。

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