具有HTTPS,SSL客户端证书和Keep-Alive支持的Ruby的HTTP库?

Dun*_*yne 7 ruby https http keep-alive

我正在尝试用Ruby编写HTTPS客户端.它将使用HTTPS连接到服务器,传递身份验证令牌(通过单独的登录过程获得)和SSL客户端证书.

我正在使用rest-client执行以下操作:

client = RestClient::Resource.new(url,
                         :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read('./certificate/client-2048.pem')),
                         :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read('./certificate/client-2048.key'), ''),
                         :verify_ssl       =>  OpenSSL::SSL::VERIFY_NONE)

# ...

headers = {
  'X-Application' => APP_KEY,
  'X-Authentication' => @session_token,
  'content-type' => 'application/json',
  'Accept' => 'application/json'
}

response = client.post(request, headers)
Run Code Online (Sandbox Code Playgroud)

这是有效的,但我想做的是使用keep-alive来避免每次我想提出请求时都要经历整个连接过程.所涉及的延迟使得我正在编写的监控应用程序变得不那么有用.

不过,我不能似乎找到一个Ruby库,它提供了以下内容:

  • HTTPS支持
  • SSL客户端证书支持
  • 活着

对于应该提供它的休息客户,有一个拉动请求. httparty具有persistent_httparty,但如果它支持SSL客户端证书,则没有相关文档.

我可以fork rest-client,合并现在已经位腐烂的pull-request,并使用它.但是我肯定在这里遗漏了一些东西......是否有现有的图书馆提供我正在寻找的东西?或者一些httparty文档解释了SSL库证书的SSL客户端证书使用情况?

任何帮助将不胜感激.

RJH*_*ter 6

有什么东西已经有效吗?

我相信HTTP客户端库Faraday是目前更多Ruby社区行动的焦点.

它附带一个:net_http_persistent适配器,支持SSL客户端证书.你可以这样做:

ssl_options = {
  cert: OpenSSL::X509::Certificate.new(File.read('./certificate/client-2048.pem')),
  key:  OpenSSL::PKey::RSA.new(File.read('./certificate/client-2048.key'), 'mypassword')
}
conn = Faraday.new(url: 'https://example.com', ssl: ssl_options) do |faraday|
  faraday.adapter = Faraday::Adapter::NetHttpPersistent
end

conn.get '/my-resource'
Run Code Online (Sandbox Code Playgroud)

HTTParty

根据规格:

...当scheme为https时提供PEM证书时产生的连接

  • 使用提供的PEM证书
  • 将验证证书

您可以使用pemclassmethod以PEM格式提供客户端证书.

REST客户端

它并没有像所有那样死 - 拉里吉尔伯特(@L2G)仍在合并拉动请求并保持灯亮.他在问题跟踪器中点头表示了他的普遍认可.我怀疑它目前不在他的优先级队列的顶部.

谁在拉请求发送的家伙,@byroot已经被保持他的代码是最新的,所以你不应该需要,而你等待做多的.


she*_*onh 6

Ruby标准库的Net :: HTTP API满足您列出的要求:HTTPS支持,SSL客户端证书支持和Keep-Alive。

由于Net :: HTTP可以在没有块语义的情况下被实例化和重用,因此也很容易包装在您自己的库中。

#!/usr/bin/env ruby
#
# https://gist.github.com/sheldonh/4693e2eca35b62b22c55

require 'openssl'
require 'net/http'
require 'json'

class Gist

  DEFAULT_OPTIONS = {
    use_ssl: true,
    verify_mode: OpenSSL::SSL::VERIFY_PEER,
    keep_alive_timeout: 30,
    cert: OpenSSL::X509::Certificate.new(File.read('./client.cert.pem')),
    key: OpenSSL::PKey::RSA.new(File.read('./client.key.pem'))
  }


  def initialize(http = nil)
    if http
      @http = http
    else
      @http = Net::HTTP.start("api.github.com", 443, DEFAULT_OPTIONS)
    end
  end

  def fetch(id, file)
    response = @http.request Net::HTTP::Get.new "/gists/#{id}"
    JSON.parse(response.body)["files"][file]["content"]
  end

end


gist = Gist.new
puts gist.fetch "fc5b5c42ff2e22171f09", "gistfile1.txt"  # Lorem ipsum
puts gist.fetch "4693e2eca35b62b22c55", "gist.rb" # This script
Run Code Online (Sandbox Code Playgroud)