Использование клиентского SSL в приложении Ruby on Rails - PullRequest
6 голосов
/ 02 ноября 2011

Я работаю над приложением для клиента, которому требуется SSL-соединение с API. Мне предоставили три файла; файл доверенного корневого сертификата (.cer), файл промежуточного сертификата (.cer) и подписанный файл ответов. Инструкции, которые мне дали для установки этого, относятся либо к IIS, либо к программе Java keytool; Я создаю приложение в Ruby on Rails, поэтому ни один из вариантов (насколько я знаю).

Сертификаты подписываются организацией, которая запускает службу API, и мне кажется, что я получаю сертификаты клиента для взаимной аутентификации соединения https. Я не уверен, как

  1. используйте сертификаты в моем приложении для подключения и используйте API
  2. что делает подписанный файл ответов

Я прочитал «Использование самозаверяющего сертификата» и эту статью об OpenSSL в Ruby , но ни одна из них, похоже, не совсем подходит (и оба полагаются на Java JRuby, который смущает вещи).

Любые указатели будут с благодарностью.

1 Ответ

4 голосов
/ 06 ноября 2011

Исходя из ваших комментариев, я предполагаю, что сертификаты имеют формат DER, который вы можете преобразовать в PEM с помощью команды openssl x509 (см .: команда openssl x509 ):

openssl x509 -inform DER -outform PEM -in certfile.cer -out certfile.pem

После этого вы можете указать библиотеке Ruby OpenSSL использовать доверенный корневой сертификат для аутентификации SSL-соединения с помощью чего-то вроде этого:

require 'socket'
require 'openssl'

tcp_sock = TCPSocket.new("my.host.tld", 443)
ctx = OpenSSL::SSL::SSLContext.new
ctx.verify_mode = OpenSSL::SSL::VERIFY_PEER|OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
#You may need to specify the absolute path to the file
ctx.ca_file = "certfile.pem"

ssl_sock = OpenSSL::SSL::SSLSocket.new(tcp_sock, ctx)
ssl_sock.sync_close = true
ssl_sock.connect
begin
  ssl_sock.post_connection_check('my.host.tld')
rescue
  puts "Certificate host did not match expected hostname"
end

После этого вы сможете читать иПишите в ssl_sock как любой другой объект Ruby IO.Если вы получили сертификат клиента, который будет использоваться для проверки подлинности сервера, вы можете настроить контекст SSL с помощью:

ctx.cert = OpenSSL::X509::Certificate.new(File.read("my_cert.pem"))
ctx.key = OpenSSL::PKey::RSA.new(File.read("my_key.rsa"))

перед созданием ssl_sock.Библиотека OpenSSL также поддерживает другие типы ключей, помимо RSA, например DSA (см .: OpenSSL :: PKey module .)

Наконец, последний совет, если вы обращаетесь к RESTfulAPI, вы можете рассмотреть использование gem, например rest-client , вместо того, чтобы обрабатывать все соединения HTTP / S напрямую.Конечно, будет ли такая библиотека подходящей или полезной, зависит от того, какую службу вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...