Как сделать так, чтобы Ruby читал открытый ключ .cer SSR? - PullRequest
2 голосов
/ 16 декабря 2009

Я работаю над сайтом RoR, для которого требуется модуль электронных платежей. Реализация электронных платежей требует, чтобы данные XML были закодированы с использованием предоставленного ими открытого ключа ssl.

Что я пытался сделать в 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 работает нормально.

Что я делаю не так?

Спасибо

Ответы [ 4 ]

8 голосов
/ 16 декабря 2009

Файл .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
2 голосов
/ 21 июня 2012

Просто обновление - текущий гем openssl для ruby ​​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 голосов
/ 06 января 2018

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

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

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

0 голосов
/ 30 июня 2011

Информацию о различных кодировках сертификатов можно найти здесь: http://www.gtopia.org/blog/2010/02/der-vs-crt-vs-cer-vs-pem-certificates/

Попробуйте конвертировать ваш сертификат из формата der в pem.

openssl x509 –in input.crt –inform DER –out output.pem
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...