2011-03-11 101 views
20

我正在研究需要生成SSH密鑰對的Ruby/Rack應用程序。儘管我想從應用程序調用ssh-keygen,但我不能這麼做,因爲它設計爲在Heroku上運行,並且不支持調用該命令。在沒有ssh-keygen的情況下生成SSH密鑰對(private/public)

我已經能夠得到使用OpenSSL私有/公共RSA密鑰在Ruby標準庫執行以下操作:

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密鑰或RSA密鑰轉換爲SSH在Ruby中不使用ssh-keygen

回答

15

事實證明,這是更爲複雜,比我的預期。我結束了寫SSHKey gem把它關閉(源代碼on GitHub)。 SSH公鑰的編碼與提供的RSA公鑰完全不同。用於SSH密鑰的數據類型編碼在RFC#4251的第5節中定義。

1
key.public_key.to_pem 

的全過程,包括密鑰加密記錄在這裏:http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/

+0

OpenSSL :: PKey :: RSA#to_pem似乎只是提供字符串輸出,它不會將其轉換爲SSH公鑰格式。 – bensie 2011-03-11 15:31:31

+0

我也試着簡單地在前面添加「ssh-rsa」,並在字符串中添加註釋語法,但它不相同,並且不被識別爲有效的公鑰。 – bensie 2011-03-11 15:36:03

25

它可能沒有的情況下,當你有問題,但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}" 
+2

這是一個非常好的和簡潔的解決方案。 – sethvargo 2014-01-09 20:40:27

+0

注意,net/ssh是一個相當大的寶石,就像猴子修補等等。 @ bensie的答案是一個更輕量級的方法 – 2018-03-09 05:06:23