22

我正在开发一个需要生成 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.....

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

4

3 回答 3

28

当您遇到问题时可能不是这种情况,但是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}"
于 2012-04-29T20:20:51.083 回答
15

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

于 2011-03-13T05:33:46.523 回答
-1
key.public_key.to_pem

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

于 2011-03-11T09:21:08.323 回答