2011-03-11 14 views
20

के बिना एसएसएच कीपैयर (निजी/सार्वजनिक) जेनरेट करें मैं एसबीएच कीपैयर उत्पन्न करने के लिए रूबी/रैक एप्लिकेशन पर काम कर रहा हूं। जितना मैं एप्लिकेशन से ssh-keygen पर कॉल करना चाहता हूं, इसलिए मैं नहीं कर सकता क्योंकि इसे हेरोकू पर चलाने के लिए डिज़ाइन किया गया है और वे उस कमांड को कॉल करने का समर्थन नहीं करते हैं।ssh-keygen

मैं निजी/सार्वजनिक आरएसए रूबी मानक पुस्तकालय में OpenSSL का उपयोग कर कुंजी कर पाने के लिए निम्न कर लिया है:

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

दुर्भाग्य से एक RSA सार्वजनिक कुंजी और एक SSH सार्वजनिक कुंजी एक ही बात नहीं है, भले ही उन्हें एक ही आरएसए कुंजी से उत्पन्न किया जा सके। एक SSH सार्वजनिक कुंजी निम्नलिखित तरह दिखता है:

ssh-rsa AAAAB3NzaC1yc2EAAAABIwA..... 

यह SSH कुंजी उत्पन्न या रूबी में SSH को RSA कुंजियों परिवर्तित ssh-keygen का उपयोग किए बिना संभव है?

उत्तर

15

बाहर कर देता है यह और अधिक जटिल था की तुलना में मैं प्रत्याशित। मैंने इसे खींचने के लिए SSHKey gem लिखना समाप्त कर दिया (स्रोत कोड on GitHub)। एसएसएच पब्लिक कुंजियां आरएसए सार्वजनिक कुंजी से पूरी तरह से अलग-अलग एन्कोड की गई हैं। एसएसएच कुंजी के लिए डेटा प्रकार एन्कोडिंग RFC#4251 की धारा # 5 में परिभाषित की गई है। - रिटर्न "ssh-rsa" या "ssh-dss" के रूप में उपयुक्त

और #to_blob - रिटर्न

#ssh_type:

1
key.public_key.to_pem 

कुंजी एन्क्रिप्शन सहित पूरी प्रक्रिया को यहाँ प्रलेखित है: http://stuff-things.net/2009/12/11/generating-rsa-key-pairs-in-ruby/

+0

ओपनएसएसएल :: पीकेई :: आरएसए # to_pem केवल स्ट्रिंग आउटपुट प्रदान करने लगता है, यह इसे एसएसएच सार्वजनिक कुंजी प्रारूप में परिवर्तित नहीं करता है। – bensie

+0

मैंने बस "एसएसएच-आरएसए" को आगे बढ़ाने और स्ट्रिंग में टिप्पणी वाक्यविन्यास जोड़ने की कोशिश की, लेकिन यह वही नहीं है और इसे वैध सार्वजनिक कुंजी के रूप में पहचाना नहीं गया है। – bensie

25

यह दो तरीकों के साथ मामला साथ नहीं दिया है जब आप समस्या थी, लेकिन net-ssh पुस्तकालय पैच OpenSSL::PKey::RSA और ::DSA ओपनएसएसएच बाइनरी-ब्लोब प्रारूप में सार्वजनिक कुंजी। यदि आप इसे बेस-एन्कोड करते हैं, तो यह वह प्रारूप है जिसे आप ढूंढ रहे हैं।

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

+0

नोट, नेट/एसएसएच काफी बड़ा मणि है और यह बंदर पैचिंग की तरह है और इसी तरह। @ बेन्सी का जवाब एक बहुत हल्का दृष्टिकोण है –