Получение 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'
...
Я сделал что-то не так? Застряв, пожалуйста, помогите.
Благодаря
Ответы
Ответ 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