OpenSSL::SSL::SSLError: SSL_connect返回值为1 errno=0 状态为error:证书验证失败。

22

我在Heroku上托管了Rails API服务器,该服务器通过一个由客户端在初始API请求中指定的回调URL发出异步POST请求。

当我尝试通过SSL向我的一位客户的Web应用程序进行POST时,出现了问题。

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配置有问题?如果是这样,我如何帮助他们调试问题?

更新:

我可以使用cURL向客户端的Web应用程序进行POST请求而没有任何问题,只有当我通过Ruby的HTTP库进行请求时才失败。

非常感谢。 谢谢

1个回答

19

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

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

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

3
我尝试过那个方法,它可行,但显然不适合生产环境。 - Tarlen
5
这个测试显示你的ca-certificates.crt文件中缺少一个中间或根证书。您还需要答案吗? - Rodrigo Murillo
1
如果证书过期或无效,curl 将会报告类似的错误。 - Akash
1
如果你收到“已初始化常量”的警告,则可以在之前使用 OpenSSL::SSL.send(:remove_const,:VERIFY_PEER)(示例代码)。 - tanius
如果您正在使用Net :: HTTP库,您必须执行以下操作:http.verify_mode = OpenSSL :: SSL :: VERIFY_NONE [参考](https://blog.engineyard.com/ruby-ssl-error-certificate-verify-failed) - Nejuf
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接