生成SSH密钥对(私钥/公钥)而不使用ssh-keygen

23

我正在开发一个 Ruby/Rack 应用程序,需要生成SSH密钥对。虽然我很想从应用程序中调用 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?

3个回答

29

也许你遇到问题时不是这种情况,但是 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}"

2
这是一个非常好的简洁解决方案。 - sethvargo
注意,net/ssh是一个相当大的gem,像猴子补丁等等。@bensie的答案是一种更轻量级的方法。 - Sam Saffron

15
结果证明,这比我预想的要复杂得多。最终我编写了SSHKey gem来完成此任务(源代码在GitHub上)。 SSH公钥与提供的RSA公钥完全不同。SSH密钥的数据类型编码在RFC#4251的第5节中定义。

-1

OpenSSL::PKey::RSA#to_pem 似乎只提供字符串输出,而不将其转换为SSH公钥格式。 - bensie
我也尝试过简单地在字符串前面添加“ssh-rsa”,并在末尾添加注释语法,但这不同,并且不能被识别为有效的公钥。 - bensie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接