在 Heroku 上的 Rails 中为 Authorize.net AIM API 使用自定义证书

Posted

技术标签:

【中文标题】在 Heroku 上的 Rails 中为 Authorize.net AIM API 使用自定义证书【英文标题】:Using custom certificates for Authorize.net AIM API in Rails on Heroku 【发布时间】:2015-08-12 15:24:16 【问题描述】:

截至几天前,Authorize.net upgraded their certificates so that they are signed using (SHA-2)。

我们的客户现在从 Authorize.net 返回此错误:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

所以我需要在 Heroku 上的 Rails 应用程序中使用它们。 Heroku 的根证书集不包含这些,因此我必须将它们包含在 ActiveMerchant 中,但我没有找到关于如何正确执行此操作的明确说明。到目前为止,这是我尝试过的:

我已经下载了 Authorize.net 所需的五个根证书,并将它们链接在一起作为“cacert.pem”,替换了我应用程序的 /vendor/plugins/active_merchant/lib/certs/ 文件夹中现有的“cacert.pem”文件(我备份了旧的 @ 987654326@ 先存档,以防万一)。这本身并没有解决问题——我在开发中仍然遇到同样的错误。

查看我创建的新“cacert.pem”文件,我看到链中的最后一个证书 (https://cacert.omniroot.com/bc2025.crt) 看起来像这样:

0Çw0Ç_†��π0 *ÜHܘ �0Z10 UIE10U Baltimore10U CyberTrust1"0 UBaltimore CyberTrust Root0 000512184600Z 250512235900Z0Z10 UIE10U Baltimore10U CyberTrust1"0 UBaltimore CyberTrust Root0Ç"0 *ÜHܘ �Ç�0Ç Ç�£ª"´ò=WË&röµy‘)‚·Ëïı∞„[é+)ödfl°]Ì∞ m€(.Œb¢b˛¥à⁄Î8Î!ù¿A+Ràw”è«∫πàµj ÁsË@ߗàbç-Âè¶P“®P√(Íı´%áäöñ©g∏?’˜˘R/¬’ppè¿ Àö·Ÿ 3zw÷¯ÏπÒhDBH“¿¬§Æ^``˛∂¶¸¥›Y‘Yòcı•c‡ê]≤zÛÖÍΑÆ^Ñ>_ˇÌiº˘96ruœwRMÛ…ê,π=Â…#S?$ò!\ô)Ω∆:ÏÁnÜ:kótc3Ωh1xçvø¸ûé]*ÜßMê‹'9�£E0C0UÂùY0ÇGXè˙T6Ü:µM0Uˇ0ˇ0Uˇ0 *ÜHܘ �Ç�Ö]é‰oQhB†›ªO'%ÑΩ˜d˝-◊0„§Î⁄))∂y?vˆ#∏ ˘X§‘apΩajä’ Ω≈º0|÷È%çÜ@OÏã~8∆7OÌ›h1éL“≥tÓæu^Hpˇ\Ñ¿yÖ∏˝æe£¿¥¯R79’©1zø†*Ùô˜£EÇ„<^ıùûµ»û|.»§ûNKm˝pmkcΩdÊ∑ŒÚü.ª∑ÚPàsí¬‚„çö2´é›ÈÓ~5´êØ>0îz–3=ßeı¸éûbœGD,]ªµ2“G“8.–˛Å‹2jµÓ<’¸ÁÅ√$BÍc9©

所以我删除了这部分,希望我至少有一个有效的文件。不确定这是否有帮助,因为我仍然收到错误消息。

我也试过改变ActiveMerchant的connection.rbconfigure_ssl方法,改

http.ca_file = File.dirname(__FILE__) + '/../../certs/cacert.pem'

http.ca_file = Rails.root + "app/vendor/plugins/active_merchant/lib/certs/cacert.pem"

我不确定这是否真的正确指向了我的cacert.pem 文件,因为我无法从该文件写入开发日志。我什至不知道如果该文件正确指向该文件,是否会使用该文件。网上严重缺乏这方面的信息。

在我解决此问题之前,我的网站已关闭。我处于完全恐慌模式。我需要查看/需要做什么的任何想法?

【问题讨论】:

我以前见过这个,重新生成密钥解决了我的问题。 看看这个:devcenter.heroku.com/articles/ssl-endpoint 我网站的 SSL 证书工作正常。这不是您在连接到 Authorize.net 的 AIM API 时指定 ActiveMerchant 使用的自定义证书的地方。我被 Heroku Support 指出了我所领导的方向,它告诉我“这看起来像一个 Ruby 应用程序,我在这里看到了一些不同的 HTTP 客户端库。如果你浏览文档,通常有一个名为 ca_path 或ca_file 或 ca_bundle 这将是您添加到应用程序的目录,其中包含您要使用的证书。” 【参考方案1】:

感谢您的帖子,我能够解决这个确切的问题。我在另一台服务器上安装了最新的 activemerchant gem,并将新 gem 中的 cacert.pem 复制到了我不工作的服务器的 /vendor/plugins/active_merchant/lib/certs/ 目录中。重启 Apache 即可成功处理 cc。

可能是一种解决方法,但至少现在我们可以再次接受付款。

【讨论】:

很高兴我能(有点?)提供帮助。我找到了一个不同的解决方案,结果证明它非常简单,只是在我能找到的任何地方都没有明确记录。希望我们的回答能帮助其他可能遇到此问题的人。【参考方案2】:

我能够自己解决这个问题,谢天谢地,这非常简单。我很高兴我也备份了我的旧 cacert.pem 文件!

我只是复制了旧 cacert.pem 文件的内容,并将其粘贴到新 cacert.pem 文件的开头。我还遗漏了上面提到的 gobbledegook Baltimore Cyber​​Trust 根证书。

我还将 ActiveMerchant 的 connection.rb configure_ssl 方法恢复为原始状态。

TL;DR

cacert.pem 中的所有旧证书之后将新证书链接在一起。繁荣!完毕。下一个!

【讨论】:

以上是关于在 Heroku 上的 Rails 中为 Authorize.net AIM API 使用自定义证书的主要内容,如果未能解决你的问题,请参考以下文章

使用 Rails + Postgresql + Heroku 构建数据库

Heroku中的rails api instagram jquery env

在 Heroku 上的 Django 应用程序中为 CORS 指定 URL

Heroku 上的 Rails 4 错误 R14(超出内存配额)

Heroku上的Rails 4应用程序获得Elasticsearch IndexMissingException

如何通过 https 和 heroku 上的 rails 服务云端资产?