如何使用 Rails ssl_post 告诉 OpenSSL 关于传出 API 调用的新证书?
Posted
技术标签:
【中文标题】如何使用 Rails ssl_post 告诉 OpenSSL 关于传出 API 调用的新证书?【英文标题】:How to tell OpenSSL about new certificates for an outgoing API call using a Rails ssl_post? 【发布时间】:2021-01-15 07:15:21 【问题描述】:FedEx 最近为他们的 API 使用了 updated their certificates,这导致 Rails ssl_post 在 active_shipping 模块中的服务器上抛出错误 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
并尝试访问 FedEx API 的人都必须遇到同样的问题,但我还没有找到任何人讨论它。
(作为奖励,FedEx 报告他们将在 October 4, 2020 上更新他们的证书,然后在 9 月 26 日提前一周更新他们,然后在 9 月 28 日返回并编辑他们的公告页面以显示证书将是9/26 续订。)
【问题讨论】:
【参考方案1】:我终于明白了。
ActiveShipping 使用ActiveUtils 连接到第三方服务器。 ActiveUtils 使用自己的certfile.pem,需要更新。
我遵循了 here 的建议,但我还必须为 ActiveUtils 添加一个覆盖 CA_FILE
,所以要明确:
-
从这里下载最新的捆绑包:
https://curl.haxx.se/docs/caextract.html
将文件放在项目中的某个位置。我选择了
config/ssl/cacert.pem
,就像本杰明伍德的例子一样。我必须创建 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
...这让我重新振作起来。
【讨论】:
以上是关于如何使用 Rails ssl_post 告诉 OpenSSL 关于传出 API 调用的新证书?的主要内容,如果未能解决你的问题,请参考以下文章
部署时如何告诉 Rails 使用生产数据库(而不是开发数据库)?
Ruby/Rails:您如何自定义 Devise 的邮件模板?