2011-03-11 18 views
20

SSH keypairs üretmek için gereken bir Ruby/Rack uygulaması üzerinde çalışıyorum. Uygulamadan ssh-keygen'u aramak istediğim kadarıyla, Heroku'da çalışmak üzere tasarlandığından ve bu komutu çağırmayı desteklemediğinden dolayı yapamam. , ssh-keygen olmadan SSH Keypairs (private/public) oluşturun

key = OpenSSL::PKey::RSA.generate(2048) 
# => -----BEGIN RSA PRIVATE KEY----- .... 
key.public_key 
# => -----BEGIN RSA PUBLIC KEY----- .... 

Maalesef bir RSA açık anahtar ve bir SSH genel anahtar aynı şey değildir:

aşağıdaki Yakut standart kütüphanesinde OpenSSL'yi özel/kamusal RSA anahtarları yapıyor almanız mümkün oldum Aynı RSA anahtarından üretilebilmelerine rağmen. Bir SSH genel anahtar aşağıdaki gibi görünür:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA..... 

o SSH anahtarları oluşturmak veya ssh-keygen kullanmadan Ruby SSH için RSA anahtarları dönüştürmek mümkün mü?

cevap

15

bu ben beklenenden çok daha karmaşık olduğu ortaya çıktı. Bunu kapatmak için SSHKey gem yazmayı bitirdim (kaynak kodu on GitHub). SSH Genel anahtarları, sağlanan RSA ortak anahtarından tamamen farklı şekilde kodlanır. SSH anahtarları için veri türü kodlaması, RFC#4251 numaralı bölümün # 5 numaralı bölümünde tanımlanmıştır. döndürür - - "ssh-rsa" veya

ve #to_blob uygun "ssh-dss" döndürür

#ssh_type:

1
key.public_key.to_pem 

anahtar şifreleme dahil olmak üzere tam süreç burada belgelenmiştir: http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/

+0

OpenSSL :: PKey :: RSA # to_pem yalnızca string çıkışı sağlıyor gibi görünüyor, SSH genel anahtar biçimine dönüştürmez. – bensie

+0

Ayrıca "ssh-rsa" 'yı hazırlamayı ve yorum söz dizimini dizeye eklemeye çalıştım, ancak aynı değil ve geçerli bir ortak anahtar olarak tanınmıyor. – bensie

25

İki yöntemle net-ssh kütüphane yamalar OpenSSL::PKey::RSA ve ::DSA sorunu varken davayı, ama olmayabilir OpenSSH ikili blob biçiminde ortak anahtar. 64 kodunu kodlarsanız, aradığınız format budur.

require 'net/ssh' 

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

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

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

Bu gerçekten hoş ve özlü bir çözümdür. – sethvargo

+0

not, net/ssh oldukça büyük bir gem ve maymun yama gibi ve böyle devam ediyor. @ bensie'nin cevabı çok daha hafif bir yaklaşımdır –