Как проверить SSL сертификат сервера? - PullRequest
0 голосов
/ 24 мая 2018

Я новичок в концепции SSL, я пытаюсь подключиться к API, который имеет взаимную аутентификацию x509, используя HTTParty.

Я получил сертификат клиента, ключ клиента и сертификат сервера (все файлы pem).

Я получил его, работая с сертификатом и ключом клиента и с verify: false.

Теперь следующим шагом является также проверка сертификата сервера?

Ссылка на документацию HTTParty https://github.com/jnunemaker/httparty/tree/master/docs#working-with-ssl

class ServiceClient
  include HTTParty
  DEFAULT_HEADERS = {
    'Content-Type' => 'application/json'
  }.freeze
  base_uri 'https://example.com'
  pem File.read("#{File.expand_path('.')}/path/to/certs/cert.pem")

  def self.iframe_url(**payload)
    post(
     '/test/create',
     body: payload.to_json,
     headers: DEFAULT_HEADERS,
     verify: false
    )
  end
end

Звонок на сервисный клиент

payload = {user_id: "100", account_id: "1234"} 
ServiceClient.iframe_url(payload)

Редактировать:

HTTParty не является жестким требованием, поэтому решение с любым http-клиентом будет работать для меня.

Если я удаляю verify: false, я получаю ошибку ниже.

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed

Ответы [ 4 ]

0 голосов
/ 31 мая 2018

По умолчанию протокол TLS только подтверждает идентичность сервера клиенту, оставляя аутентификацию клиента серверу на уровне приложений, например, HTTP-аутентификация Basic.

Взаимная аутентификация TLS относитсяклиенту и серверу, аутентифицирующим друг друга одновременно.Он может использоваться как альтернатива базовой аутентификации HTTP.Это также часто называют проверкой подлинности на основе сертификатов.

Похоже, вы получаете эту ошибку (но работает с verify: false), потому что сертификат сервера не является доверенным.Это самоподписанный?Или, возможно, центр сертификации (ЦС), выдавший сертификат, не является доверенным в вашей системе.

HTTParty построен поверх Net::HTTP, который использует OpenSSL, который получает сертификаты доверенного ЦС отсистема, например /etc/ssl/cert.pem.Хотя вы можете переопределить переменную окружения SSL_CERT_FILE, я не думаю, что это хорошая идея, поскольку она может повлиять на другие части вашего приложения.Лучшим решением было бы передать сертификаты CA только HTTParty.

Я никогда не использовал HTTParty, так что терпите меня.Но если быстро взглянуть на код и предположить, что вы используете значение по умолчанию ConnectionAdapter, похоже, вам нужно определить опции pem и ssl_ca_file, которые будут определять клиент и сертификат CAфайлы соответственно.Также обратите внимание, что при этом будет проверять сертификат на .

class ServiceClient
  include HTTParty
  pem "path/to/client_cert_and_key.pem"
  ssl_ca_file "path/to/ca_certificates.pem"
end

Я не думаю, что это связано с вашей проблемой, но если ваш клиентский ключ имеет парольную фразу,не забудьте передать его на pem(pem_contents, password).

HTH.Лучший.

0 голосов
/ 29 мая 2018

Попробуйте, как вы, я полагаю, вы используете ssl-сертификат, который вы хотите проверить.Также в RestClient все гораздо проще, я добавляю фрагмент кода в конце.

class ServiceClient
  include HTTParty
  DEFAULT_HEADERS = {
    'Content-Type' => 'application/json'
  }.freeze
  base_uri 'https://example.com'
  ssl_ca_file "#{File.expand_path('.')}/path/to/certs/cert.pem"


  def self.iframe_url(**payload)
    post(
     '/test/create',
     body: payload.to_json,
     headers: DEFAULT_HEADERS,
    )
  end
end

Решение Rest Client:

client = RestClient::Resource.new('https://example.com/',
                              :ssl_client_cert => p12.certificate,
                              :ssl_client_key => p12.key,
                              :verify_ssl => OpenSSL::SSL::VERIFY_NONE)
0 голосов
/ 30 мая 2018

Это должно решить проблему:

RestClient::Resource.new(
  'https://example.com',
  :ssl_client_cert  =>  OpenSSL::X509::Certificate.new(File.read("cert.pem")),
  :ssl_client_key   =>  OpenSSL::PKey::RSA.new(File.read("key.pem"), "passphrase, if any"),
  :ssl_ca_file      =>  "ca_certificate.pem",
  :verify_ssl       =>  OpenSSL::SSL::VERIFY_PEER
).get

Ссылка: https://github.com/rest-client/rest-client

0 голосов
/ 29 мая 2018

Используйте "OpenSSL :: SSL :: VERIFY_PEER = OpenSSL :: SSL :: VERIFY_NONE"

В вашем коде может выглядеть примерно так:

    class ServiceClient
      include HTTParty
      OpenSSL::SSL::VERIFY_PEER = OpenSSL::SSL::VERIFY_NONE
      {...your code...}
    end
...