2009-12-16 3 views
2

Я работаю на веб-сайте RoR, для которого требуется модуль электронного платежа. Для реализации электронного платежа требуется, чтобы данные XML были закодированы с использованием общедоступного ключа ssl, предоставленного ими.Как мне сделать Ruby read .cer public ssl key?

То, что я пытался сделать в Ruby:

public_key = OpenSSL::PKey::RSA.new(File.read(public_key_file)) 

Если я просто пытаюсь открыть файл отдельно он работает отлично. Но метод RSA.new() возвращает следующую ошибку:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key:: nested asn1 error 
    from (irb):5:in `initialize' 
    from (irb):5:in `new' 
    from (irb):5 

Из того, что я видел в онлайн-документации используется .pem файл, но мой открытый ключ что-то вроде public.cer. Может ли это быть проблема ? Ключ сам по себе подходит для примера PHP, предоставленного компанией электронных платежей, тот же файл public.cer работает нормально.

Что я делаю неправильно?

Спасибо,

ответ

8

Файл .cer, скорее всего, сертификат X.509 в кодировке DER. К сожалению, Ruby не предоставляет интерфейс OpenSSL для чтения сертификата в DER. Поэтому вам нужно сначала преобразовать DER в PEM. Это довольно легко в Ruby,

b64 = Base64.encode64(File::read(cert_file)) 
pem = "-----BEGIN CERTIFICATE-----\n#{b64}-----END CERTIFICATE-----\n" 
cert = OpenSSL::X509::Certificate.new(pem) 
public_key = cert.public_key 
+0

Я попробовал ваше решение, и это работает прекрасно, пока я не сделаю: «серт = OpenSSL :: X509 :: Certificate.new (PEM)», в которой указать, что дает мне такое же сообщение об ошибке. Также я заметил некоторые символы «\ n» в коде сертификата, может ли это быть проблемой? Спасибо – Brayn

+0

Да. Существует дополнительный \ n. Я редактировал код. –

+0

Я пробовал новую версию кода без везения. Спасибо, в любом случае. – Brayn

2

Просто обновление - текущий OpenSSL драгоценный камень рубин 1.9.3 поддерживает сертификаты чтения из файла в DER и формате PEM.

cert = OpenSSL::X509::Certificate.new('certificate.pem') 
cert = OpenSSL::X509::Certificate.new('certificate.cer') 

См. Документацию по адресу http://www.ruby-doc.org/stdlib-1.9.3/libdoc/openssl/rdoc/OpenSSL/X509/Certificate.html.

0

Попробуйте заменить File.read на File.binread.

В зависимости от вашей платформы (Windows наиболее восприимчива) File.read может не вернуть то, что вы ожидаете. Используя File.binread, вы убедитесь, что вы получаете фактические двоичные данные бинарного сертификата, который вы читаете, и хотите работать.

Некоторые фон на разнице: https://stackoverflow.com/a/30081354/252627

Смежные вопросы