在没有ssh-keygen的情况下生成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情况下生成SSH密钥或将RSA密钥转换为Ruby中的ssh-keygen

当遇到问题时可能不是这种情况,但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}" 

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

 key.public_key.to_pem 

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