Подтвердить что ты не робот

Получение OpenSSL:: X509:: CertificateError вложенная ошибка asn1 на Ruby

У меня есть файл .p12 от Apple и попытался преобразовать его в файл .pem с помощью следующей команды:

openssl pkcs12 -in cert.p12 -out apple_push_notification_development.pem -nodes -clcerts

При попытке создать новый объект OpenSSL:: X509:: Certificate с помощью

OpenSSL::X509::Certificate.new(File.read('apple_push_notification_development.pem'))

Я получаю следующую ошибку:

OpenSSL::X509::CertificateError: nested asn1 error
    from (irb):9:in `initialize'
    from (irb):9:in `new'
    ...

Я сделал что-то не так? Застряв, пожалуйста, помогите. Благодаря

4b9b3361

Ответ 1

Оцените это не в том же самом сценарии, но я пытался прочитать в PEM файле (PKCS7) в моем экземпляре. OpenSSL CLI будет декодировать его в порядке, но ruby ​​продолжает бросать ту же самую вложенную ошибку asn1, которую вы описываете, когда я пытался загрузить ее в объект.

В моем случае ему понадобилась новая строка, то есть "\n" в конце файла PEM, чтобы он ее принял.

Я работал только тогда, когда создал пустой объект и сравнивал сгенерированный вывод PEM с файлом, который пытался загрузить.

Итак, с сертификатом X509 можно попробовать:

cert = OpenSSL::X509::Certificate.new
cert.to_pem
=> "-----BEGIN CERTIFICATE-----\nMCUwGwIAMAMGAQAwADAEHwAfADAAMAgwAwYBAAMBADADBgEAAwEA\n-----END CERTIFICATE-----\n"

И сравните его с вашим файлом PEM

Как вы можете видеть, это прекращено с новой строкой и отсутствовало в файле, который я пытался импортировать.

Ответ 2

У меня была такая же проблема, и я хотел, чтобы мне пришлось декодировать содержимое файла с помощью Base64.

require 'openssl'
require 'base64'

encoded_content = File.read('apple_push_notification_development.pem')
decoded_content = Base64.decode64(encoded_content)
certificate = OpenSSL::X509::Certificate.new(decoded_content)

Ответ 3

Это также может случиться, когда вы забудете подписать новый сгенерированный сертификат. Я хотел использовать самозаверяющий сертификат, но забыл подписать часть.

# Create key
key = OpenSSL::PKey::RSA.new(2048)
open("key.pem", "w") do |io| io.write(key.to_pem) end

# Generate certificate
name = OpenSSL::X509::Name.parse("CN=example.com/C=EE")
cert = OpenSSL::X509::Certificate.new
cert.version     = 2
cert.serial      = 0
cert.not_before  = Time.now
cert.not_after   = cert.not_before + 1 * 365 * 24 * 60 * 60 # 1 year validity
cert.public_key  = key.public_key
cert.subject     = name

и эта часть кода - это то, что я пропустил:

cert.issuer = name
cert.sign key, OpenSSL::Digest::SHA1.new
open "cert.pem", 'w' do |io| io.write cert.to_pem end