如何让HTTParty忽略SSL证书验证?

58

我正在使用本地服务器测试一个应用程序,并从我的计算机向该服务器发出请求。

测试服务器的SSL证书存在问题,因此HTTParty会因此而抛出错误。根据我所了解的,HTTParty应默认忽略SSL,但当我尝试这样做时:

HTTParty.get( "#{ @settings.api_server }#{ url }" ).parsed_response

它抛出了这个错误:

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

我该如何让它忽略SSL证书?


2
将API URI更改为http而不是https,或者如果指定了端口443,则删除它? - Mike Campbell
请查看此处 - https://github.com/jnunemaker/httparty/issues/93 - maerics
嘿,使用http代替https是可以的,谢谢Mike!我已经看到了你所提到的那个问题,maerics。如果我正确理解了那个小讨论,我一开始就不应该出现这些错误,这也是我发布这个问题的原因,我当时毫无头绪。 - Jasper Kennis
如果您使用二进制方式安装了带有RVM的Ruby和Homebrew的OpenSSL,则两者之间存在不匹配。请参见此问题:http://stackoverflow.com/questions/30901864/troubleshooting-ssl-certificates-ruby-mac-os-x-yosemite/33035529#33035529。 - Petrus Repo
4个回答

71

在最新的HTTParty中,你可以使用verify选项来禁用SSL验证。

HTTParty.get( "#{ @settings.api_server }#{ url }", :verify => false ).parsed_response

1
httparty-0.13.7 - 没有运气 - okliv
我尝试了0.13.7版本,你的建议很好用。我的调用稍微简单一些:HTTParty.get(url, :verify => false)。 - guero64
谢谢你的回答!不过我很好奇,是什么导致它起作用的呢? - James N

37
为使 HTTParty 总是跳过 SSL 证书验证,而不必在每次调用中指定:
require 'httparty'
HTTParty::Basement.default_options.update(verify: false)

HTTParty.get("#{@settings.api_ssl_server}#{url1}")
HTTParty.get("#{@settings.api_ssl_server}#{url2}")
HTTParty.get("#{@settings.api_ssl_server}#{url3}")
# ...

当将HTTParty作为模块引入时,您还可以将其限定在一个类中:

require 'httparty'

class Client
  include HTTParty
  default_options.update(verify: false)
end

Client.get("#{@settings.api_ssl_server}#{url1}")
Client.get("#{@settings.api_ssl_server}#{url2}")
Client.get("#{@settings.api_ssl_server}#{url3}")

或者
require 'httparty'

module APIHelpers
  class Client
    include HTTParty
    default_options.update(verify: false)
  end
end
World(APIHelpers)

Client.get("#{@settings.api_ssl_server}#{url1}")
Client.get("#{@settings.api_ssl_server}#{url2}")
Client.get("#{@settings.api_ssl_server}#{url3}")

最新版本的httparty 0.13.7对我有效。谢谢(Y) - Mostafa Hussein

6

如果您仍然希望发送您的证书,请使用此标志:

verify_peer: false

1
在我看来,这是最好的答案。我不明白为什么有人会想要完全关闭SSL,特别是在生产环境中。 - mgabz

1
这可能完全不准确,因为我是 Ruby 的新手,但这是其他解决方案无法解决时对我有效的方法。
OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE

如果你遇到“动态常量赋值”(从这里获取),还有其他的做法。

OpenSSL::SSL.const_set(:VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE) 

这会导致语法错误:动态常量赋值 - Farley Knight
更多关于此的信息可以在这里找到 - 这应该只用于开发或测试,永远不要在生产环境中使用: https://dev59.com/63NA5IYBdhLWcg3wC5NR#1113614 - Brad Parks
1
我在 env.rb 中添加了这段代码,对我来说效果很好! - CarolCiola

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