在 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Ωh1xçvø¸ûé]*ÜßMê‹'9�£E0C0UÂùY0ÇGXè˙T6Ü:µM0Uˇ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.rb
configure_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 CyberTrust 根证书。
我还将 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(超出内存配额)