POST-запросы с помощью Ruby Faraday OpenSSL PKCS12 - PullRequest
0 голосов
/ 07 мая 2018

Добрый день!

Я пытаюсь отправить POST-запросы на сервер через ssl-соединение с сертификатом .p12 из Windows 7 с библиотекой Ruby's Faraday.

Версия Ruby - ruby ​​2.3.3p222(2016-11-21 редакция 56859) [x64-mingw32]

Версия камня Фарадея: faraday (0.14.0, 0.9.2)

1) У меня есть папка со следующимфайлы сертификатов:

  • [cert_name] .crt,
  • [cert_name] .csr,
  • [cert_name] .key,
  • [cert_name] .p12

2) Что касается кода, у меня есть следующее:

require "faraday"
require "json"
require "openssl"
data = [JSON_object]
host = 'https://[domain_name]'
url = '[string]/[string]'
p12 = OpenSSL::PKCS12.new(File.open('[path_to_folder_with_cert_files]/[cert_name].p12', "rb").read, "[password]")
key = p12.key
cert = p12.certificate
connection = Faraday::Connection.new host, :ssl => {
  :client_cert => cert,
  :client_key => key,
  :ca_file => '[path_to_folder_with_cert_files]/[cert_name].crt',
  :verify => false
}
puts response.status = connection.post do |req|
  req.url(url)
  req.headers['Content-Type'] = @headers["content_type"]
  req.body = data
end

Ответ имеет 403 Запрещено.Я протестировал без ssl-соединения данные, URL-адрес, параметры хоста и состояние 200 OK.

Пожалуйста, помогите, поскольку я не нашел учебника / вопроса по этому конкретному использованию Ruby's Faraday и OpenSSL :: PKCS12

1 Ответ

0 голосов
/ 10 декабря 2018

У меня сработало следующее:

class Gateway
  def call
    connection.get do |req|
      req.url(url)
      req.headers['Content-Type'] = 'text/xml'
      req.body = data
    end
  end

  def connection
    Faraday.new(ssl: ssl) do |builder|
      builder.request :retry
      builder.response(:logger) unless Rails.env.test?
      builder.adapter :net_http
    end
  end

  def ssl
    {
      client_key: client_key,
      client_cert: client_cert,
      ca_file: 'CA.crt' # optional
    }
  end

  def url
    'https://...'
  end

  def client_key
    p12.key
  end

  def client_cert
    p12.certificate
  end

  def p12
    OpenSSL::PKCS12.new(p12_file.read, p12_password)
  end

  def p12_file
   File.open('<path-to-p12-file>', 'rb')
  end

  def p12_password
    'password' # if password protected
  end
end

И использование:

puts Gateway.new.call.body
...