Apertura di una chiave privata RSA da Ruby
-
04-07-2019 - |
Domanda
Penso che so come creare chiavi RSA crittografate personalizzate, ma come posso leggere una crittografata come fa ssh-keygen?
So di poterlo fare:
OpenSSL::PKey::RSA.new(File.read('private_key'))
Ma poi OpenSSL mi chiede la passphrase ... Come posso passarla a OpenSSL come parametro?
E come posso crearne uno compatibile con quelli generati da ssh-keygen?
Faccio qualcosa del genere per creare chiavi crittografate private:
pass = '123456'
key = OpenSSL::PKey::RSA.new(1024)
key = "0000000000000000#{key.to_der}"
c = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
c.encrypt
c.key = Digest::SHA1.hexdigest(pass).unpack('a2' * 32).map {|x| x.hex}.pack('c' * 32)
c.iv = iv
encrypted_key = c.update(key)
encrypted_key << c.final
Inoltre, le chiavi generate da OpenSSL :: PKey :: RSA.new (1024) (senza crittografia), non funzionano quando provo accessi senza password (ovvero copio la chiave pubblica sul server e utilizzo il uno privato per accedere).
Inoltre, quando apro un file ssh-keygen tramite OpenSSL e ne controllo il contenuto, sembra che abbia caratteri aggiuntivi all'inizio e alla fine della chiave. È normale?
Non capisco davvero alcune di queste cose di sicurezza, ma sto cercando di imparare. Che cosa sto facendo di sbagliato?
Soluzione 2
Ho fatto alcuni progressi su questo. Se uso la libreria Net :: SSH, posso farlo:
Net::SSH::KeyFactory.load_private_key 'keyfile', 'passphrase'
Leggendo il codice sorgente devo ancora capire cosa fa la libreria a PKey :: RSA. di OpenSSL per farlo ... E poi vado e testo di nuovo, e abbastanza sicuro, OpenSSL può aprire la chiave privata bene senza Net :: SSH ... Ho fatto così tanti test che in qualche modo non l'ho provato correttamente prima.
Ma ho ancora il problema di creare una coppia di chiavi compatibile con SSH ... e forse andrò di nuovo al test e avrò la risposta: P ... nah, non sono così interessato a quella parte
Altri suggerimenti
Secondo il post del blog qui:
http : //stuff-things.net/2008/02/05/encrypting-lots-of-sensitive-data-with-ruby-on-rails/
Puoi semplicemente fare:
OpenSSL :: PKey :: RSA.new (File.read ('private_key'), 'passphrase')
Buona fortuna.