web-dev-qa-db-fra.com

Obtenir OpenSSL :: X509 :: CertificateError imbriqué erreur asn1 sur Ruby

J'ai un fichier .p12 de Apple et j'ai essayé de le convertir en fichier .pem avec la commande suivante:

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

Lorsque vous essayez de créer 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'
    ...

Est-ce que j'ai fait quelque chose de mal ? Être coincé, aidez-moi. Merci

20
Khoa Nguyen

Appréciez que ce n'est pas exactement votre même scénario, mais j'essayais de lire un fichier PEM (PKCS7) dans mon cas. OpenSSL CLI le décodait bien, mais Ruby continuait de lancer la même erreur asn1 imbriquée que vous décrivez lorsque j'ai essayé de la charger dans un objet.

Dans mon cas, il avait besoin d'une nouvelle ligne, c'est-à-dire '\ n' à la fin du fichier PEM pour l'accepter.

Je ne l'ai travaillé que lorsque j'ai créé un objet vide et comparé la sortie PEM générée au fichier que j'essayais de charger.

Donc, avec un cert X509, essayez peut-être:

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

Et comparez-le à votre fichier PEM

Comme vous pouvez le voir, il se termine par une nouvelle ligne et il manquait dans le fichier que j'essayais d'importer.

13
ste

J'ai eu le même problème et dans mon cas, j'avais besoin de décoder le contenu des fichiers 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)
10
Michał Młoźniak

Cela peut également se produire lorsque vous oubliez de signer un certificat nouvellement généré. Je voulais utiliser un certificat auto-signé mais j'ai oublié de signer une 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 du code est ce que j'ai manqué:

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