Getting OpenSSL:: X509:: CertificateError embested asn1 error on Ruby

Je l'ai fait .P12 fichier à partir D'Apple et essayé de le convertir en .pem fichier avec la commande suivante:

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

lors de la création d'un nouvel objet OpenSSL:: X509:: Certificate avec

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

j'obtiens l'erreur suivante:

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

ai-je Fait quelque chose de mal ? D'être coincé, s'il vous plaît aider. Merci

15
demandé sur Eran 2014-06-17 16:29:03

3 réponses

J'apprécie que ce ne soit pas exactement le même scénario que vous, mais j'ai essayé de lire dans un fichier PEM (PKCS7) dans mon cas. OpenSSL CLI le décoderait très bien, mais ruby a continué à lancer la même erreur imbriquée que vous décrivez quand j'ai essayé de le charger dans un objet.

dans mon cas, il lui fallait une nouvelle ligne, c'est-à-dire '\n' à la fin du fichier PEM pour l'accepter.

Je n'ai trouvé la solution que lorsque j'ai créé un objet vide et comparé la sortie PEM générée au fichier que j'étais essaie de charger.

donc avec un x509 cert peut-être essayer:

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

Et de le comparer à votre fichier PEM

comme vous pouvez le voir, il est terminé avec une nouvelle ligne et qui manquait dans le fichier que j'essayais d'importer.

9
répondu ste 2014-11-08 17:17:17

j'ai eu le même problème et je suis mon cas j'ai dû décoder le contenu du fichier avec 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)
8
répondu Michał Młoźniak 2015-03-17 15:31:07

cela peut aussi se produire lorsque vous oubliez de signer le certificat nouvellement généré. Je voulais utiliser le certificat auto-signé mais j'ai oublié de signer la partie.

# 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

et cette partie de code est ce que j'ai raté:

cert.issuer = name
cert.sign key, OpenSSL::Digest::SHA1.new
open "cert.pem", 'w' do |io| io.write cert.to_pem end
4
répondu Raccoon 2015-06-05 10:17:28