【问题标题】:Generate SSH Keypairs (private/public) without ssh-keygen在没有 ssh-keygen 的情况下生成 SSH 密钥对(私有/公共)
【发布时间】:2011-07-13 07:49:36
【问题描述】:

我正在开发一个需要生成 SSH 密钥对的 Ruby/Rack 应用程序。尽管我想从应用程序中调用 ssh-keygen,但我不能,因为它是为在 Heroku 上运行而设计的,而且它们不支持调用该命令。

我已经能够在 Ruby 标准库中使用 OpenSSL 获取私有/公共 RSA 密钥,执行以下操作:

key = OpenSSL::PKey::RSA.generate(2048)
# => -----BEGIN RSA PRIVATE KEY----- ....
key.public_key
# => -----BEGIN RSA PUBLIC KEY----- ....

很遗憾,RSA 公钥和 SSH 公钥不是一回事,尽管它们可以从同一个 RSA 密钥生成。 SSH 公钥如下所示:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA.....

是否可以在不使用ssh-keygen 的情况下在 Ruby 中生成 SSH 密钥或将 RSA 密钥转换为 SSH?

【问题讨论】:

    标签: ruby ssh ssh-keys net-ssh


    【解决方案1】:
    key.public_key.to_pem
    

    包括密钥加密在内的完整过程记录在此:http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/

    【讨论】:

    • OpenSSL::PKey::RSA#to_pem 似乎只提供字符串输出,它不会将其转换为 SSH 公钥格式。
    • 我也尝试过简单地添加“ssh-rsa”并将注释语法附加到字符串中,但它不一样并且不被识别为有效的公钥。
    【解决方案2】:

    事实证明,这比我预期的要复杂得多。我最终写了SSHKey gem 来完成它(源代码on GitHub)。 SSH 公钥的编码方式与提供的 RSA 公钥完全不同。 SSH 密钥的数据类型编码在RFC #4251 的第 5 节中定义。

    【讨论】:

      【解决方案3】:

      您遇到问题时可能并非如此,但net-ssh 库使用两种方法修补了OpenSSL::PKey::RSA::DSA

      #ssh_type - 根据需要返回 "ssh-rsa""ssh-dss"

      #to_blob - 返回 OpenSSH 二进制 blob 格式的公钥。如果您对它进行 base64 编码,它就是您要查找的格式。

      require 'net/ssh'
      
      key = OpenSSL::PKey::RSA.new 2048
      
      type = key.ssh_type
      data = [ key.to_blob ].pack('m0')
      
      openssh_format = "#{type} #{data}"
      

      【讨论】:

      • 这是一个非常简洁的解决方案。
      • 注意,net/ssh 是一个相当大的 gem,就像猴子补丁等等。 @bensie 的答案是一种更轻量级的方法
      猜你喜欢
      • 1970-01-01
      • 2016-09-15
      • 2011-04-22
      • 2020-08-06
      • 2021-09-10
      • 2013-09-02
      • 2019-05-05
      相关资源
      最近更新 更多