在没有ssh-keygen的情况下生成SSH密钥对(私有/公共)

时间:2011-03-11 08:00:36

标签: ruby ssh ssh-keys net-ssh

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

3 个答案:

答案 0 :(得分:28)

遇到问题可能不是这种情况,但net-ssh库补丁OpenSSL::PKey::RSA::DSA有两种方法:

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

#to_blob - 以OpenSSH binary-blob格式返回公钥。如果你对它进行64位编码,那么它就是你正在寻找的格式。

require 'net/ssh'

key = OpenSSL::PKey::RSA.new 2048

type = key.ssh_type
data = [ key.to_blob ].pack('m0')

openssh_format = "#{type} #{data}"

答案 1 :(得分:15)

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

答案 2 :(得分:-1)

key.public_key.to_pem

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