Что вызывает «Ни PUB-ключ, ни PRIV-ключ :: nested asn1 error» при создании открытого ключа в ruby? - PullRequest
34 голосов
/ 19 февраля 2010

При создании открытого ключа с использованием модуля OpenSSL :: PKey :: RSA путем передачи ему файла .pem, что является причиной ответа:

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

Вот источник:

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

Ответы [ 7 ]

30 голосов
/ 22 октября 2012

У меня та же проблема, и у нее была другая причина. Теперь угадайте, что:

...

Чертов пароль был неверен :( Искал 3 дня для этого "решения". Может быть "Извини, чувак, это неправильный пароль!" вместо «вложенной ошибки asn1» imho, но в любом случае, может, это кому-нибудь поможет.

13 голосов
/ 20 февраля 2010

Файл pem не является открытым ключом, это сертификат X509 в кодировке base64, который среди многих полей содержит открытый ключ.Я не знаю Ruby или модуля OpenSSL ruby, но я бы искал некоторую функцию, которая считывает файлы PEM и выводит сертификат X509, а затем другую функцию для извлечения открытого ключа из сертификата.

10 голосов
/ 13 апреля 2017

Если вы используете, например, dotenv, вы должны окружить значение " и иметь \n для перевода строки.

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIICW  ... UcuUtU0eIl\n-----END RSA PRIVATE KEY-----"
3 голосов
/ 10 июля 2014

Моя проблема заключалась в том, что OpenSSL::PKey::RSA.new() хочет файл содержимое , а не путь к файлу. Таким образом, используя что-то вроде этого работало:

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

ОП уже делал это, но, надеюсь, это кому-нибудь поможет. Поскольку предполагается, что это содержимое файла, а не путь к файлу, даже если вы укажете неверный путь, вы не будете предупреждены.

3 голосов
/ 20 марта 2013

У меня тоже была похожая проблема, но я сначала не создавал pem-файл для своего файла id_rsa.pub. Для меня мне нужно было создать файл pem из моего существующего открытого ключа:

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

Затем я скопировал эту строку OpenSSL в мой тестовый файл, где она использовалась. В конце концов, для меня это выглядело так.

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

После этого метод перестал выдавать эту ошибку.

0 голосов
/ 28 марта 2019

Убедитесь, что ваши .pem файлы имеют этот формат.

public_key_file.pem:

-----BEGIN PUBLIC KEY-----

// Your public key goes here

-----END PUBLIC KEY-----

* 1008 1009 * ** private_key_file.pem:
-----BEGIN RSA PRIVATE KEY-----

// Your private key goes here

-----END RSA PRIVATE KEY-----
0 голосов
/ 18 октября 2017

В моем случае функция ожидала закрытый ключ, пока в некоторой переменной хранился сертификат.Обмен ввода с закрытым ключом исправил ошибку.

...