web-dev-qa-db-fra.com

Quelle est la cause de l'erreur "Ni clé PUB ni clé PRIV :: erreur imbriquée asn1" lors de la création d'une clé publique en ruby?

Lors de la construction d'une clé publique à l'aide du module OpenSSL :: PKey :: RSA en lui transmettant un fichier .pem, quelle est la cause d'une réponse:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key:: nested asn1 error
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `initialize'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `new'
from /Users/Matt/projects/placepop/lib/apn.rb:48:in `open'
from (irb):1

Voici la source:

cert = File.join(Rails_root, 'config', 'apns', 'sandbox-cert.pem')
APN_CONFIG = { :delivery => { 
                              :Host => 'gateway.sandbox.Push.Apple.com', 
                              :cert => cert,
                              :passphrase => "",
                              :port => 2195 },
               :feedback => {  
                              :Host => 'feedback.sandbox.Push.Apple.com',
                              :port => 2196,
                              :passphrase => "",
                              :cert => cert} }


options = APN_CONFIG[:delivery].merge(options)
cert = File.read(options[:cert])
ctx = OpenSSL::SSL::SSLContext.new
ctx.key = OpenSSL::PKey::RSA.new(cert, options[:passphrase])
ctx.cert = OpenSSL::X509::Certificate.new(cert)

sock = TCPSocket.new(options[:Host], options[:port])
ssl = OpenSSL::SSL::SSLSocket.new(sock, ctx)
ssl.sync = true
ssl.connect
28
Matthew

Un fichier pem n'est pas une clé publique, c'est un certificat X509 codé en base64 qui contient, parmi ses nombreux champs, une clé publique. Je ne connais pas Ruby, ni le module OpenSSL Ruby, mais je rechercherais une fonction qui lit dans les fichiers PEM et génère un certificat X509, puis une autre fonction permettant d’extraire la clé publique du certificat.

13
James K Polk

J'ai le même problème et la cause était différente. Maintenant, devinez quoi :)

...

Ce foutu mot de passe était erroné: ( A cherché cette "solution" pendant 3 jours. Cela aurait pu être un "Désolé mec, c'est un mauvais mot de passe!" quelqu'un.

28
2called-chaos

Si vous utilisez dotenv par exemple, vous devez entourer la valeur avec " et avoir \n pour les nouvelles lignes.

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIICW  ... UcuUtU0eIl\n-----END RSA PRIVATE KEY-----"
9
Dorian

Mon problème était que OpenSSL::PKey::RSA.new() veut le fichier contenu et pas le chemin du fichier. Ainsi, en utilisant quelque chose comme ceci a fonctionné:

OpenSSL::PKey::RSA.new(File.read "./spec/support/keys/server.key")

Le PO le faisait déjà, mais j'espère que cela aidera quelqu'un. Parce que le contenu du fichier est supposé, pas un chemin, même si vous fournissez un chemin invalide, vous ne serez pas averti.

3
Tyler Collier

J'ai eu un problème similaire aussi, mais pour moi je n'ai pas créé un fichier pem pour mon fichier id_rsa.pub. Pour moi, je devais créer un fichier PEM à partir de ma clé publique existante:

ssh-keygen -f testing_rsa.pub  -e -m pem > pem

Ensuite, j'ai copié cette chaîne OpenSSL dans mon fichier de test où elle était utilisée. Cela ressemblait à ceci à la fin pour moi. 

@pub_key = "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAoxi2V0bSKqAqUtoQHxWkOPnErCS541r6/MOSHmKOd6VSNHoBbnas\nZRQSDUTbffB6C++DbmBCOHmvzYORD0ZWYgyMcgbYJD48Z2fe0nm+WMYN5u8DPnTP\nvf8b/rJBxGF0dsaoFAWlB81tTnKFCxAbCSgfmQt+Vd4qupGZ5gGu9uoKlaPjmYuA\nIxIjUMcu3dov7PQ+PZIvdkM0fiz8YIl8zo+iWWyI2s6/XLoZJ4bYs2YJHZDf6biU\nsZhs8xqh/F6qlcRt3Ta25KMa0TB9zE3HHmqA/EJHFubWFRCrQqpboB0+nwCbmZUl\nhaxA79FRvYtORvFAoncoFD4tq3rGXcUQQwIDAQAB\n-----END RSA PUBLIC KEY-----\n"
.
.
.
OpenSSL::PKey::RSA.new(@pub_key)

Après cela, la méthode a cessé de générer cette erreur. 

2
Ninjaxor

Dans mon cas, la fonction s'attendait à une clé privée alors qu'un certificat était stocké dans une variable. L'échange de l'entrée avec une clé privée a corrigé l'erreur.

0
Rafael Bugajewski