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

ben*_*sie 21 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----- ....
Run Code Online (Sandbox Code Playgroud)

遗憾的是,RSA公钥和SSH公钥不是一回事,即使它们可以使用相同的RSA密钥生成.SSH公钥类似于以下内容:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA.....
Run Code Online (Sandbox Code Playgroud)

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

ben*_*izi 28

当遇到问题时可能不是这种情况,但net-ssh库使用两种方法修补OpenSSL :: PKey :: RSA:: DSA:

#ssh_type- 返回"ssh-rsa""ssh-dss"视情况而定

#to_blob-返回OpenSSH的二进制格式的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}"
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常好的简洁解决方案. (2认同)

ben*_*sie 15

事实证明,这比我预期的要复杂得多.我最终编写了SSHKey gem以将其关闭(GitHub上的源代码).SSH公钥的编码方式与提供的RSA公钥完全不同.SSH密钥的数据类型编码在RFC#4251的#5部分中定义.