【问题标题】:What causes "Neither PUB key nor PRIV key:: nested asn1 error" when building a public key in ruby?在 ruby​​ 中构建公钥时,是什么导致“既不是 PUB key 也不是 PRIV key::nested asn1 错误”?
【发布时间】:2010-02-19 01:58:59
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    例如,如果您使用dotenv,则必须用" 将值括起来并使用\n 换行。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你是对的。问题出在从证书导出 pem 文件的方式上。未包含私钥。
      • 我遇到了同样的问题。导出证书时到底做错了什么?我的 .pem 文件在文件底部包含我的私钥。
      • 我也有同样的问题...我只传递了我的私钥!
      • 这解决了我的问题:stackoverflow.com/a/39115092/1180523。将 PEM 内容作为一行(使用 \n)存储在 ENV 变量中,然后确保使用链接中的 .gsub 建议。
      • 我的(愚蠢的)问题是,即使我给它提供了私钥,私钥行的左边还是有空格,因为它已经缩进了。左对齐键字符串的每一行消除了这个错误。
      【解决方案3】:

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

      ...

      该死的密码错误:( 为该“解决方案”搜索了 3 天。可能是“对不起,伙计,那是错误的密码!”而不是“嵌套 asn1 错误”恕我直言,但无论如何,也许这会对某人有所帮助。

      【讨论】:

      • 也应该有人用坚固的棍子戳上游... 逃脱
      • 我确认,遇到了同样的问题,是密码错误导致的。感谢您的帖子,我能够修复它。错误信息肯定不准确。
      • @2call-chaos 截至 2018 年,我非常感谢你哈哈,我认为 pw 有错别字是我在检查一些不起作用的代码时想到的最后一件事,该错误消息不能不要更没用
      • 你这个男人!我不知道我弄乱了密码。但是重新创建密钥解决了这个问题。非常感谢!
      【解决方案4】:

      如果上述答案均无效,则可能是由于算法不正确。较新的公钥是使用ECDSA 算法而不是RSA 生成的,因此应该使用OpenSSL::PKey::EC 类。

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

      【讨论】:

        【解决方案5】:

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

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

        但是这个奏效了:

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

        护脸

        【讨论】:

          【解决方案6】:

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

          【讨论】:

          • 只是添加到 LTI 1.3 参考实现的链接,这给了我这个错误,直到我按照你的建议离开 BEGIN 和 END cmets:lti-ri.imsglobal.org
          【解决方案7】:

          我也遇到了类似的问题,但对我来说,我一开始并没有为我的 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)
          

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

          【讨论】:

            【解决方案8】:

            我在使用 dotenv 和 rails 时遇到了这个错误。 问题不在于 dotenv gem。 通过打印 ENV['PRIVATE_KEY']

            确认它分配了正确的值

            出现问题是因为我在 YAML 文件中加载了这个值并进行了 ERB 处理,这导致删除了 \n 字符,因此使值无效

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

            【讨论】:

              【解决方案9】:

              我的问题是 OpenSSL::PKey::RSA.new() 想要文件 contents 而不是文件路径。因此,使用这样的东西是可行的:

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

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  猜你喜欢
                  • 2013-01-01
                  • 1970-01-01
                  • 2011-02-09
                  • 2016-01-08
                  • 1970-01-01
                  • 2013-05-09
                  • 2012-06-17
                  • 1970-01-01
                  相关资源
                  最近更新 更多