Какие причины "Ни ключ PUB, ни PRIV key:: nested asn1 error" при создании открытого ключа в ruby?
При создании открытого ключа с использованием модуля 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
Ответы
Ответ 1
Файл pem не является открытым ключом, это сертификат X509 с кодировкой base64, который содержит среди множества полей открытый ключ. Я не знаю Ruby или OpenSSL ruby module, но я хотел бы найти некоторую функцию, которая читает в файлах PEM и выводит сертификат X509, а затем другую функцию для извлечения открытого ключа из сертификата.
Ответ 2
У меня такая же проблема, и у меня другая причина. Теперь угадайте, что:)
...
Проклятый пароль был неправильным:(
Искал 3 дня для этого "решения". Может быть, "Извините, чувак, что неправильный пароль!" вместо "вложенной ошибки asn1" imho, но в любом случае, возможно, это поможет кому-то.
Ответ 3
Если вы используете dotenv
, например, вы должны окружить значение "
и иметь \n
для строк новой строки.
PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIICW ... UcuUtU0eIl\n-----END RSA PRIVATE KEY-----"
Ответ 4
Моя проблема заключалась в том, что OpenSSL::PKey::RSA.new()
хочет файл содержимое, а не путь к файлу. Таким образом, используя что-то вроде этого работало:
OpenSSL::PKey::RSA.new(File.read "./spec/support/keys/server.key")
ОП уже делал это, но, надеюсь, это поможет кому-то. Поскольку предполагается, что это содержимое файла, а не путь к файлу, даже если вы указали неверный путь, вы не будете предупреждены.
Ответ 5
У меня тоже была аналогичная проблема, но для меня я вообще не создавал файл 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)
После этого метод остановил эту ошибку.
Ответ 6
В моем случае функция ожидала закрытого ключа, пока был сохранен сертификат в некоторой переменной. Обмен входом с закрытым ключом исправил ошибку.
Ответ 7
Убедитесь, что ваши .pem
файлы в этом формате.
public_key_file.pem:
-----BEGIN PUBLIC KEY-----
// Your public key goes here
-----END PUBLIC KEY-----
private_key_file.pem:
-----BEGIN RSA PRIVATE KEY-----
// Your private key goes here
-----END RSA PRIVATE KEY-----