gpt4 book ai didi

ruby-on-rails - Heroku Rails Net::HTTP: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: 证书验证失败

转载 作者:数据小太阳 更新时间:2023-10-29 07:33:50 24 4
gpt4 key购买 nike

我有一个在 Heroku 服务器上运行的 Rails 应用程序,但我在使用 Net::HTTP over HTTPS 与外部服务器通信时遇到了问题。每当我尝试 POST 时收到的错误通过 HTTPS 到外部专有 API 是:

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

我已经用谷歌搜索了好几个小时来寻找我遇到的问题的答案,但无济于事。这是我的环境:

  • 运行 Cedar 14 的 Heroku Dyno(之前运行的是 Cedar 10,升级到 Cedar 14 看看它是否会影响这个问题——不高兴)
  • rails 3.2.14rc2
  • ruby 2.1.2

我尝试过的“修复”:

在开发中本地运行时通信似乎工作正常(我使用了 RVM override method suggested here ),但是当我在 Heroku 服务器上尝试时,我运气不好。

更新:即使使用 RVM 更新,这似乎也无法在本地工作。

最后但同样重要的是,这是我正在运行的代码的抽象变体:

uri = URI.parse("https://api.mysite.com/api/v1")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = (uri.scheme == "https")
request = Net::HTTP::Post.new(uri.path, {'Content-Type' =>'application/json'})
request_body = "{\"post_body\": \"data1\"}"
response = http.request(request)

有人对我还应该看什么有什么建议吗?

最佳答案

Heroku 无法验证您的服务器证书是否由它识别的 CA 根有效签名。这可能是因为:

  1. 您的证书未由 CA 或中间机构签名(即自签名)
  2. 您的证书是由 Heroku 不知道(不太可能)的 CA 签署的
  3. API 服务器未提供正确的中间证书来帮助 Heroku 将其连接到有效的 CA 根目录。 (可能)

从您的 shell 尝试 openssl s_client -showcerts -connect your-api-host.com:443。你应该看到类似这样的东西:

depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = PositiveSSL, CN = www.coffeepowered.net
verify return:1

您特别希望确保链中的所有证书都返回 verify return: 1。如果这在你的 shell 中有效,那么你的机器可能安装了你的 Heroku 实例没有的根证书。

在不知道您的 API 服务器返回什么证书的情况下,很难明确地回答这个问题,但是您可能需要提供一个中间证书包以及 SSL 证书本身。这个中间证书包将由您的 SSL 证书签署者提供,并且可以通过 SSLCertificateChainFile 在 Apache 中提供。 ,或者在 nginx 中通过将中间体与您的证书连接起来(根据 this documentation )。

如果您不能更改 API 服务器的配置,那么您的“手动覆盖证书文件位置”解决方案可能非常接近正确(这与提供中间证书,除了客户端这样做),但您可能没有为 API 服务器的证书提供正确的证书链包。确保您向 OpenSSL 提供了正确的中间证书链,它应该可以按预期工作。

关于ruby-on-rails - Heroku Rails Net::HTTP: OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: 证书验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29836698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com