OpenSSL::SSL::SSLError: SSL_connect 返回=1 errno=0 state=error: 证书验证失败

Tar*_*len 14 ssl ruby-on-rails faraday

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

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

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

以下抛出错误:

Faraday::Error::ConnectionFailed: SSL_connect returned=1 errno=0 state=error: certificate verify failed
Run Code Online (Sandbox Code Playgroud)

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

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

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

更新:

我可以毫无问题地将 POST 卷曲到客户端的 web 应用程序,只有当我通过 ruby​​ 的 HTTP 库执行它时才会失败

非常感谢谢谢

rla*_*mbe 13

我的猜测是您客户端的 Web 应用程序的 SSL 证书存在问题。也许有一个过期或无效的证书。你可以试试这个答案

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

require 'openssl'
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
Run Code Online (Sandbox Code Playgroud)

  • 此测试表明您的 ca-certificates.crt 文件中缺少中间证书或根证书。你还需要答案吗? (4认同)
  • 我试过了,它有效,但它显然不适合生产环境 (3认同)