FedEx最近更新了他们的API证书,这导致在active_shipping模块中的服务器上的Railssl_post抛出错误The SSL connection to the remote server could not be established
。
该应用程序是Rails 5.0&Ruby 2.3.1,通过OpsWorks在AWS EC2(Amazon Linux(上提供服务。
新的证书文件或多或少是这样的:
- gateway.fedex.com.pem(包含一个证书(
- gateway-intermediate.pem(包含两个证书(
- DigiCertGlobalRoot.pem(包含一个证书(
OpenSSL配置:
openssl version
返回OpenSSL 1.0.1k-fips 8 Jan 2015
openssl version -d
返回OPENSSLDIR: "/etc/pki/tls"
/etc/pki/tls/
内部是cert.pem
和一个certs
目录。我已经尝试过将证书添加到cert.pem
和将它们添加到certs
目录。我还尝试将它们添加到/etc/ssl/certs
,并将它们附加到/etc/ssl/certs/ca-bundle.crt
和/etc/ssl/certs/ca-bundle.trust.crt
。我尝试创建一个SSL_CERT_DIR
环境变量,然后创建一个指向这些位置的SSL_CERT_FILE
环境变量。
所以我有了这些新证书;如何告诉OpenSSL有关它们的信息?我把它们放在哪里?我发现了很多关于如何设置证书以保护web请求的主域安全的文档和建议,但很少有关于如何配置第三方提供的辅助证书的信息。我觉得任何使用active_shipping
并试图访问联邦快递API的人都一定有同样的问题,但我还没有找到任何人讨论它
(作为奖励,联邦快递报告称,他们将于2020年10月4日续订证书,然后于9月26日提前一周续订,然后在9月28日返回并编辑了他们的公告页面,以显示证书将于9月25日续订。(
我终于弄清了真相。
ActiveShipping使用ActiveUtils连接到第三方服务器。ActiveUtils使用自己的certfile.pem,该文件需要更新。
我遵循了这里的建议,尽管我还必须为ActiveUtils添加一个覆盖CA_FILE
,所以要明确:
- 从这里下载最新的捆绑包:https://curl.haxx.se/docs/caextract.html
- 将文件放在项目中的某个位置。我选择了
config/ssl/cacert.pem
作为benjaminwood的例子。我不得不创建ssl
目录,因为它不存在 - 创建一个初始值设定项,如下所示:
# config/initializers/00_monkeypatch_updated_ca_cert.rb
module ActiveMerchant
class Connection
CA_FILE = Rails.root.join('config', 'ssl', 'cacert.pem').to_s
end
end
module ActiveUtils
class Connection
CA_FILE = Rails.root.join('config', 'ssl', 'cacert.pem').to_s
end
end
这让我重新振作起来。