Abrindo uma chave privada RSA de Ruby
-
04-07-2019 - |
Pergunta
I pensar Eu sei como criar chaves RSA personalizado criptografados, mas como posso ler um criptografado como ssh-keygen faz?
Eu sei que posso fazer isso:
OpenSSL::PKey::RSA.new(File.read('private_key'))
Mas então OpenSSL me pede a senha ... Como posso passá-lo para OpenSSL como parâmetro?
E, como eu posso criar um compatível com os gerados por ssh-keygen?
eu fazer algo assim para criar chaves privadas criptografadas:
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
Além disso, as chaves geradas pelo OpenSSL :: PKEY :: RSA.new (1024) (sem criptografia), não funcionam quando tento logins sem senha (ou seja, eu copiar a chave pública para o servidor e usar o um privado para login).
Além disso, quando eu abrir um arquivo ssh-keygen via OpenSSL e depois verificar o seu conteúdo, que parece ter caracteres adicionais no início e no final da chave. Isso é normal?
Eu não realmente compreender algumas dessas coisas de segurança, mas eu estou tentando aprender. O que é que eu estou fazendo errado?
Solução 2
Eu tenho feito alguns progressos sobre este assunto. Se eu usar a biblioteca Net :: SSH, eu posso fazer isso:
Net::SSH::KeyFactory.load_private_key 'keyfile', 'passphrase'
Ao ler o código fonte que eu ainda tenho que descobrir o que a biblioteca faz para do OpenSSL PKEY :: RSA.new para alcançar este objetivo ... E então eu vou e teste novamente, e com certeza, OpenSSL pode abrir a chave privada muito bem sem Net :: SSH ... fiz testes tanto que de alguma forma eu não testei isso corretamente antes.
Mas eu ainda tenho o problema de criar um par de chaves SSH compatível ... e talvez eu vou testar novamente e ter a resposta: P ... nah, eu não sou tão interessado em que parte
Outras dicas
De acordo com o post aqui:
http : //stuff-things.net/2008/02/05/encrypting-lots-of-sensitive-data-with-ruby-on-rails/
Você pode simplesmente fazer:
OpenSSL :: PKEY :: RSA.new (File.read ( 'private_key'), 'senha')
O melhor de sorte.