什么原因导致在ruby中构建公钥时“PUB键和PRIV键都没有嵌套asn1错误”?

时间:2010-02-19 01:58:59

标签: ruby-on-rails ssl certificate rsa apple-push-notifications

使用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

10 个答案:

答案 0 :(得分:28)

我遇到了同样的问题,原因各有不同。现在猜猜:)

...

该死的密码错了:( 搜索了3天的“解决方案”。可能是一个“抱歉老兄,这是错误的密码!”而不是“嵌套asn1错误”imho,但无论如何,也许这将有助于某人。

答案 1 :(得分:13)

pem文件不是公钥,它是base64编码的X509证书,在其许多字段中包含公钥。我不知道Ruby或OpenSSL ruby​​模块,但我会寻找一些读取PEM文件并输出X509证书的函数,然后是另一个从证书中提取公钥的函数。

答案 2 :(得分:10)

例如,如果您使用的是dotenv,则必须使用"包围该值,并为新行添加\n

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

答案 3 :(得分:3)

我的问题是OpenSSL::PKey::RSA.new()想要文件内容而不是文件路径。因此,使用这样的东西起作用了:

OpenSSL::PKey::RSA.new(File.read "./spec/support/keys/server.key")
OP已经这样做了,但希望这会对某人有所帮助。因为它假定它是文件内容而不是文件路径,即使您提供了无效路径,也不会收到警告。

答案 4 :(得分:2)

我也有类似的问题,但对我来说,我首先没有为我的id_rsa.pub文件创建一个pem文件。对我来说,我需要用现有的公钥创建一个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)

之后该方法停止抛出该错误。

答案 5 :(得分:1)

在将 dotenv 与rails一起使用时出现此错误。 问题与 dotenv 宝石无关。 通过打印 ENV ['PRIVATE_KEY']

确认已分配正确的值

发生问题是因为我通过 ERB 处理将该值加载到 YAML 文件中,并导致删除了 \ n 字符,因此值无效

我发现的解决方法是直接使用 ENV ['PRIVATE_KEY'] ,而不是通过 YAML

答案 6 :(得分:0)

在我的情况下,当某个变量中存储了证书时,该函数需要私钥。用私钥交换输入修复了错误。

答案 7 :(得分:0)

确保您的.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-----

答案 8 :(得分:0)

我在测试中使用Webrick,并尝试使用错误的类实例化我的私钥,导致我收到该错误消息:

    SSLCertificate: OpenSSL::PKey::RSA.new(File.open(MOCK_CERT).read),

但是有效:

    SSLCertificate: OpenSSL::X509::Certificate.new(File.open(MOCK_CERT).read),

人脸

答案 9 :(得分:0)

如果以上答案均无效,则可能是由于算法错误。较新的公钥使用ISNEW() || ISCHANGED(Account__c) || ISCHANGED(PE_Channel__c)算法而不是ECDSA制成,因此应使用RSA类。

您可以使用此online tool验证密钥的算法。它会检测算法并提供有关密钥的有用信息。