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

Mat*_*hew 36 ssl rsa ruby-on-rails certificate apple-push-notifications

通过传递.pem文件使用OpenSSL :: PKey :: RSA模块构建公钥时,响应的原因是什么:

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
Run Code Online (Sandbox Code Playgroud)

这是来源:

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
Run Code Online (Sandbox Code Playgroud)

2ca*_*aos 31

我有同样的问题,它有不同的原因.现在猜猜:)

...

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

  • 有人也应该用坚固的棍子向上游戳戳这件事...... *逃脱* (2认同)
  • 我确认,有同样的问题,是错误的密码导致的。感谢您的帖子,我能够修复它。错误信息绝对不准确。 (2认同)

Jam*_*olk 14

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


Dor*_*ian 12

dotenv例如,如果您正在使用,则必须包含值"并使用\n换行符.

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\nMIICW  ... UcuUtU0eIl\n-----END RSA PRIVATE KEY-----"
Run Code Online (Sandbox Code Playgroud)


Nin*_*xor 5

我也有类似的问题,但对我来说,我一开始就没有为 id_rsa.pub 文件创建 pem 文件。对我来说,我需要用现有的公钥创建一个 pem 文件:

ssh-keygen -f testing_rsa.pub  -e -m pem > pem
Run Code Online (Sandbox Code Playgroud)

然后我将该 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)
Run Code Online (Sandbox Code Playgroud)

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