【问题标题】:Unable to Generate RSA Public key in ruby无法在 ruby​​ 中生成 RSA 公钥
【发布时间】:2019-05-10 20:11:07
【问题描述】:

我无法为字符串格式的公钥创建 OpenSSL::PKey::RSA 类的对象。以下是我的代码:

public_key = '-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAttI6ImgD74PhHWVqnrqSOmStboplyL02DB3/nc2iyDdYLzXoBIQN+NPMBPlsZlEKuKjsg5Ycfp6VjcmncM3CH9MGIr+Lmbj1HZmO/jJGJ84RPhzYOiZuElzs3seIcOtOa3BpFeqRsXJlrf1IVBKVU3erka5ACLVyrsjmp/VXMx5QjPD0qXARMGb6rDewTkyg3pGz07Y7rZgXkTl54ase+XaPegOankxdEQhVjPdrk7eSlIQS5Ni7FAcSyTOtYoPgiP7W0PolOMHvpFg96CHjc8V8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDAQAB-----END PUBLIC KEY-----'
OpenSSL::PKey::RSA.new public_key

我收到以下错误:

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error

我使用的是 ruby​​ 版本 ruby​​ 2.3.7。任何人都可以告诉我字符串或函数有什么问题。?

我已尝试添加\n 解决方案建议here

public_key = "-----BEGIN PUBLIC KEY-----MIIB\nIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAttI6ImgD74PhHWVqnrqSOmStboplyL02DB3/nc2iyDdYLzXoBIQN+NPMBPlsZlEKuKjsg5Ycfp6VjcmncM3CH9MGIr+Lmbj1HZmO/jJGJ84RPhzYOiZuElzs3seIcOtOa3BpFeqRsXJlrf1IVBKVU3erka5ACLVyrsjmp/VXMx5QjPD0qXARMGb6rDewTkyg3pGz07Y7rZgXkTl54ase+XaPegOankxdEQhVjPdrk7eSlIQS5Ni7FAcSyTOtYoPgiP7W0PolOMHvpFg96CHjc8V8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDA\nQAB-----END PUBLIC KEY-----"

但我遇到了同样的错误

OpenSSL::PKey::RSAError: Neither PUB key nor PRIV key: nested asn1 error

在不同的地方添加\n

public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAttI6ImgD74PhHWVqnrqSOmStboplyL02DB3/nc2iyDdYLzXoBIQN+NPMBPlsZlEKuKjsg5Ycfp6VjcmncM3CH9MGIr+Lmbj1HZmO/jJGJ84RPhzYOiZuElzs3seIcOtOa3BpFeqRsXJlrf1IVBKVU3erka5ACLVyrsjmp/VXMx5QjPD0qXARMGb6rDewTkyg3pGz07Y7rZgXkTl54ase+XaPegOankxdEQhVjPdrk7eSlIQS5Ni7FAcSyTOtYoPgiP7W0PolOMHvpFg96CHjc8V8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDAQAB\n-----END PUBLIC KEY-----"

public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAttI6ImgD74PhHWVqnrqSOmStboplyL02DB3/nc2iyDdYLzXoBIQN+NPMBPlsZlEKuKjsg5Ycfp6VjcmncM3CH9MGIr+Lmbj1HZmO/jJGJ84RPhzYOiZuElzs3seIcOtOa3BpFeqRsXJlrf1IVBKVU3erka5ACLVyrsjmp/VXMx5QjPD0qXARMGb6rDewTkyg3pGz07Y7rZgXkTl54ase+XaPegOankxdEQhVjPdrk7eSlIQS5Ni7FAcSyTOtYoPgiP7W0PolOMHvpFg96CHjc8V8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDA\nQAB-----END PUBLIC KEY-----"

正在生成相同的错误消息。

谢谢

【问题讨论】:

  • 可能是 anothermh 链接的页面上的第三个答案。将字符串用双引号括起来,并在MII 之后和QAB 之前(字符串的开头和结尾)添加\n(字面意思)在控制台中工作。
  • @JayDorsey 请分享您的字符串,因为即使在字符串中添加 \n 后我也会遇到相同的错误。为了进一步调查,我在我的问题中添加了字符串谢谢。
  • 你放错了。像这样:"-----BEGIN PUBLIC KEY-----\nMII...QAB\n-----END PUBLIC KEY-----"
  • @Amadan 我仍然遇到同样的错误。谢谢

标签: ruby rsa


【解决方案1】:

OpenSSL::PKey::RSA.new 类无法创建新对象,因为它们的公共字符串密钥存在问题。

我通过以下方式发现密钥无效:

在 ruby​​ 控制台/irb 中

puts public_key.to_s.gsub('\n', "\n")

将输出保存在名为 public_key.txt 的文件中,然后在 ubuntu 终端上运行以下命令

openssl pkey -inform PEM -pubin -in public_key.txt -noout &> /dev/null
if [ $? != 0 ] ; then
    echo "this was definitely not a public key in PEM format"
    exit 1
fi

如果密钥无效,将打印上述脚本

这绝对不是 PEM 格式的公钥

如果密钥有效,则不会打印任何内容。

谢谢

【讨论】:

    【解决方案2】:

    这不会对我产生任何错误(您的原始字符串产生了您提到的相同错误)。

    require 'openssl'
    public_key = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAttI6ImgD74PhHWVqnrqSOmStboplyL02DB3/nc2iyDdYLzXoBIQN+NPMBPlsZlEKuKjsg5Ycfp6VjcmncM3CH9MGIr+Lmbj1HZmO/jJGJ84RPhzYOiZuElzs3seIcOtOa3BpFeqRsXJlrf1IVBKVU3erka5ACLVyrsjmp/VXMx5QjPD0qXARMGb6rDewTkyg3pGz07Y7rZgXkTl54ase+XaPegOankxdEQhVjPdrk7eSlIQS5Ni7FAcSyTOtYoPgiP7W0PolOMHvpFg96CHjc8V8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDAQAB\n-----END PUBLIC KEY-----"8xDsFdh0wbHd49WcKxiJMIfL65VUIW5aob9fw05a5FczyASa0iNtRiICy/QnCqQIDAQAB\n-----END PUBLIC KEY-----"
    OpenSSL::PKey::RSA.new public_key 
    

    返回 #<OpenSSL::PKey::RSA:0x00007fa78b9b6ee8> 而不是错误。如果我删除\n,我可以重现您记录的错误。

    Ruby 2.5.3,macOS,使用通过 homebrew 安装的 openssl。

    【讨论】:

      猜你喜欢
      • 2022-08-10
      • 2017-09-24
      • 1970-01-01
      • 2011-07-11
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 2019-08-15
      • 2014-10-26
      相关资源
      最近更新 更多