2010-02-19 12 views
22

Quando si costruisce una chiave pubblica usando OpenSSL :: :: PKEY modulo RSA facendola passare un file .pem, qual è la causa di una risposta:Che cosa causa "Né la chiave PUB né la chiave PRIV: nested asn1 error" quando si costruisce una chiave pubblica in ruby?

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 

Ecco la fonte:

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 

risposta

12

Un file pem non è una chiave pubblica, è un certificato X509 codificato in base64 che contiene, tra i suoi numerosi campi, una chiave pubblica. Non conosco Ruby, o il modulo rubino OpenSSL, ma cercherò qualche funzione che legge nei file PEM e restituisce un certificato X509, quindi un'altra funzione per estrarre la chiave pubblica dal certificato.

+0

Hai ragione. Il problema era dal modo in cui il file pem è stato esportato dal certificato. La chiave privata non è stata inclusa. – Matthew

+1

Sto avendo lo stesso problema. Che cosa hai fatto di sbagliato quando esporti il ​​certificato? Il mio file .pem contiene la mia chiave privata nella parte inferiore del file. – tobyc

+0

Sto avendo lo stesso problema ... passo solo la mia chiave privata! –

25

Ho lo stesso problema e ha avuto una causa diversa. Ora, indovinate un po ':)

...

La password maledetta era sbagliato :( Cercato 3 giorni per quella "soluzione". Avrebbe potuto essere un "dude dispiace, questa è la password sbagliata!" Invece di " nested asn1 error "imho ma comunque, forse questo aiuterà qualcuno ..

+1

Anche in questo caso qualcuno dovrebbe colpire a monte con un bastone robusto ... * fugge * – Smar

+0

Confermo, ho avuto lo stesso problema e una password sbagliata lo stava causando. Grazie al tuo post, sono stato in grado di risolverlo. Il messaggio di errore non è sicuramente preciso. – lkartono

2

Ho avuto anche un problema simile, ma per me non stavo creando un file pem per il mio file id_rsa.pub in primo luogo. necessario per creare un file pem dalla mia chiave pubblica esistente:

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

Quindi ho copiato la stringa OpenSSL nel mio file di test in cui era in uso. Sembrava questo alla fine per me.

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

Dopo che il metodo ha interrotto l'errore.

2

Il mio problema era che OpenSSL::PKey::RSA.new() desidera il file contenuto e non il percorso del file. Così, utilizzando qualcosa di simile ha funzionato:

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

Il PO è stato già facendo questo, ma spero che questo aiuterà qualcuno. Perché presuppone che sia il contenuto del file e non un percorso di file, anche se fornisci un percorso non valido non sarai avvisato.

4

Se si utilizza dotenv ad esempio, è necessario circondare il valore con " e avere \n per newline.

0

Nel mio caso la funzione prevede una chiave privata mentre in alcune variabili è stato memorizzato un certificato. Scambiare l'input con una chiave privata ha corretto l'errore.