Как заставить Ruby читать открытый ssl-ключ .cer?

Я работаю над веб-сайтом 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 работает нормально.

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

Спасибо,


person Brayn    schedule 16.12.2009    source источник


Ответы (4)


Файл .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
person ZZ Coder    schedule 16.12.2009
comment
Я попробовал ваше решение, и оно работает нормально, пока я не сделаю: cert = OpenSSL::X509::Certificate.new(pem), после чего оно выдает мне то же сообщение об ошибке. Также я заметил некоторые символы \n в коде сертификата, может ли это быть проблемой? Спасибо - person Brayn; 17.12.2009
comment
Я пробовал новую версию кода без везения. Спасибо, в любом случае. - person Brayn; 18.12.2009
comment
Если вы выложите шестнадцатеричный дамп файла, я смогу выяснить проблему. - person ZZ Coder; 18.12.2009
comment
получение ошибки с Base64.b64encode(File::read(cert_file), 64), я думаю, что это Base64.encode64(File::read(cert_file)) - person CodecPM; 23.11.2016
comment
используйте это Base64.encode64(File::read(cert_file)). Метод b64encode отсутствует для модуля Base64. - person Mukesh Singh Rathaur; 02.03.2017

Просто обновление — текущий гем 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.

person FuePi    schedule 21.06.2012

Информацию о различных кодировках сертификатов можно найти здесь: 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
person Peder    schedule 30.06.2011

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

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

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

person janpio    schedule 06.01.2018