【问题标题】:OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failedOpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: 证书验证失败
【发布时间】:2015-11-12 10:43:07
【问题描述】:

我在 Heroku 上托管了 Rails API 服务器,它向客户端在初始 API 请求中指定的回调 url 发出异步 POST 请求。

当我尝试通过 SSL 发布到我的客户的一个 web 应用程序时遇到问题。

connection = Faraday::Connection.new('https://subdomain.some_client.com', ssl: { ca_file: '/usr/lib/ssl/certs/ca-certificates.crt' })
connection.get '/test'

以下抛出错误:

Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=error: certificate verify failed

但是,如果我通过 HTTPS 发布到另一台服务器,例如谷歌,它可以正常工作

connection = Faraday::Connection.new('https://www.google.com', ssl: { ca_file: '/usr/lib/ssl/certs/ca-certificates.crt' })
connection.get '/'

这是否意味着客户端的 SSL 配置有问题?如果是这样,我该如何帮助他们调试问题?

更新:

我可以毫无问题地将 POST 卷曲到客户端的 webapp,只有当我通过 ruby​​ 的 HTTP 库执行此操作时才会失败

非常感谢 谢谢

【问题讨论】:

    标签: ruby-on-rails ssl faraday


    【解决方案1】:

    我的猜测是您客户的网络应用程序的 SSL 证书存在问题。可能存在过期或无效的证书。你可以试试this answer。

    如果您需要解决这个问题(但可能不是一个好的永久解决方案,因为存在潜在的安全漏洞),您应该能够通过将其放在 Bundler.require 之前关闭证书验证在您的 application.rb 中:

    require 'openssl'
    OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
    

    【讨论】:

    • 我试过了,它可以工作,但它显然不适合生产环境
    • 此测试表明您的 ca-certificates.crt 文件中缺少中间证书或根证书。你还需要答案吗?
    • 如果证书过期或无效,curl 会报类似的错误。
    • 如果您收到“已初始化常量”警告的变体:在 (example code) 之前使用 OpenSSL::SSL.send(:remove_const, :VERIFY_PEER)。
    • @RodrigoM 你是想问塔伦吗?由于他没有被标记,他可能没有发送你的评论
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2019-03-09
    • 2012-05-30
    • 2016-01-15
    相关资源
    最近更新 更多