1

我有一个 rake 任务,它通过 SSL 连接从外部 API 提取和解析 JSON 数据。

我使用了一个封装了这个外部 API 的 gem,并且在本地运行没有问题,但是在 heroku 上运行时任务失败了#<Curl::Err::SSLCaertBadFile: Curl::Err::SSLCaertBadFile>

我安装了搭载 SSL 插件,希望它可以修复它,但没有骰子。

有任何想法吗?

更新

我设法通过对先前由以下两个字段设置的 curl 请求禁用 ssl 验证来修复它:

request.ssl_verify_peer
request.ssl_verify_host

除了降低安全性之外,我对 SSL 的了解还不够,无法确切知道为什么错误是由 heroku 环境中的这些设置引起的,或者禁用它的含义是什么。

4

1 回答 1

2

禁用证书检查是个坏主意。见http://www.rubyinside.com/how-to-cure-nethttps-risky-default-https-behavior-4010.html , http://jamesgolick.com/2011/2/15/verify-none..有关该主题的更多信息,请参阅html和相关参考资料。

问题是您的 HTTP 客户端不知道在哪里可以找到 heroku 上的 CA 证书包。

您没有提及您使用的是什么客户端,但这里是net/https在 heroku 上使用的示例:

require "net/https"
require "uri"

root_ca_path = "/etc/ssl/certs"

url = URI.parse "https://example.com"
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = (url.scheme == "https")

if (File.directory?(root_ca_path) && http.use_ssl?)
  http.ca_path = root_ca_path
  http.verify_mode = OpenSSL::SSL::VERIFY_PEER
  http.verify_depth = 5
end

request = Net::HTTP::Get.new(url.path)
response = http.request(request)

下面是一个使用法拉第的例子:

Faraday.new "https://example.com", ssl: { ca_path: "/etc/ssl/certs" }

祝你好运。

于 2012-03-26T05:08:31.180 回答