📌  相关文章
📜  httparty SSL_connect 返回=1 errno=0 state=error: 证书验证失败(无法获取本地颁发者证书)(OpenSSL::SSL::SSLError) - Ruby (1)

📅  最后修改于: 2023-12-03 15:01:20.262000             🧑  作者: Mango

介绍

当你使用 Ruby 的 HTTParty 这个库进行请求时,你可能会遇到证书验证失败的错误信息,具体的错误信息通常会提示 SSL_connect 返回=1 errno=0 state=error: 证书验证失败(无法获取本地颁发者证书)(OpenSSL::SSL::SSLError)

这个错误信息通常是在进行 SSL/TLS 连接时,客户端无法验证服务端的证书导致的。

本篇文章将介绍这个错误出现的原因,以及如何解决这个问题。

原因

当你使用 HTTParty 这个库发起 HTTPS 请求时,你需要进行 SSL/TLS 连接。在进行 SSL/TLS 连接时,客户端会验证服务端的证书,以确保服务端的身份可靠。

当客户端无法验证服务端的证书时,就会抛出 OpenSSL::SSL::SSLError 这个错误。这通常有以下几种原因:

  1. 客户端无法验证服务端颁发的证书,也就是说客户端缺少了服务端证书颁发机构的根证书或中间证书。这种情况通常会发生在服务端使用自签发证书或第三方证书颁发机构的根证书未被客户端信任。

  2. 服务端的证书已过期,通常是因为证书的有效期已经结束。

  3. 服务端的证书已被吊销,通常是因为证书的持有者存在不当行为。

  4. 服务端的证书不正确,证书的主题与实际的域名不符合。

  5. 其他原因,如客户端的时间与服务端的时间不一致等。

解决方法

解决这个错误的方法通常是下载并安装证书颁发机构的根证书或中间证书。

对于第三方证书颁发机构的证书,你可以在他们的网站上下载根证书或中间证书,然后将这些证书添加到你的操作系统或应用程序中。

对于自签发证书,你可以将自签发证书添加到你的应用程序信任列表中。例如,在 HTTParty 中,你可以使用 verify: false 参数来跳过证书验证:

require "httparty"

response = HTTParty.get("https://example.com", verify: false)

当然,跳过证书验证是不安全的,所以最好还是安装证书并进行验证。

总结

SSL_connect 返回=1 errno=0 state=error: 证书验证失败(无法获取本地颁发者证书)(OpenSSL::SSL::SSLError) 这个错误通常是客户端无法验证服务端的证书导致的。解决方法是下载证书颁发机构的根证书或中间证书,并将其添加到你的操作系统或应用程序中。当然,为了安全起见,最好还是进行证书验证。