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
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.
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)
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