Исходя из ваших комментариев, я предполагаю, что сертификаты имеют формат 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 напрямую.Конечно, будет ли такая библиотека подходящей или полезной, зависит от того, какую службу вы используете.