解决方法
使用Ruby标准库的SSL请求
require 'net/http' require 'uri' Net::HTTP.get URI('https://encrypted.google.com')
如果传递一个URI对象,那么Ruby(> = 2.0.0)中的Net :: HTTP默认执行SSL验证.见https://github.com/ruby/ruby/blob/778bbac8ac2ae50f0987c4888f7158296ee5bbdd/lib/net/http.rb#L481
uri = URI('https://expired.badssl.com/') Net::HTTP.get(uri) # OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify Failed
使用Ruby HTTP宝石的SSL请求
如果您希望使用替代方案,您可以使用以下宝石,默认情况下也执行SSL验证:
> Excon
Excon是一个纯Ruby HTTP实现.
require 'excon' Excon.get 'https://encrypted.google.com'
> Curb
Curb是一个使用libcurl的HTTP客户端.
require 'curl' Curl.get 'https://encrypted.google.com'
> http.rb
HTTP或http.rb是一个纯粹的Ruby HTTP实现,但使用http_parser.rb来解析HTTP请求和响应.由于http_parser.rb使用本机扩展,因此它声称是最快的HTTP客户端库之一.但一如以往,一定要吃一些盐的基准.
require 'http' HTTP.get 'https://encrypted.google.com'
HTTPClient是另一个纯Ruby实现.
require 'httpclient' HTTPClient.get 'https://encrypted.google.com'
这里列出的是HTTP库,而不是HTTP包装器.诸如HTTParty和Faraday之类的包装宝石可以绕过特定的HTTP实现,也可以使用适配器来提供统一的HTTP接口.您可以查看这个Comparison matrix of Ruby HTTP client features.它比较了每个HTTP客户端库的功能.但请注意,自2012年以来信息未更新.