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

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

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

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

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

例如,如果您使用的是dotenv ,则必须使用"并且为\n来换行”。

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

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

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

OP已经这样做了,但希望这会对某人有所帮助。 因为它假设它是文件内容而不是文件路径,即使您提供了无效路径,也不会收到警告。

我也有类似的问题,但对我来说,我首先没有为我的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) 

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

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