2010-02-21 5 views
3

privé J'ai créé une clé privée RSA en Ruby avec:OpenSSL en rubis: PKCS # 8 pour les clés

require 'openssl' 
key = OpenSSL::PKey::RSA.generate(1024) 

Je peux obtenir la clé dans des formats PEM ou DER:

key.to_pem 
key.to_der 

Mais il ne semble pas y avoir un moyen de l'obtenir au format PKCS # 8. Le meilleur que je suis venu avec est d'appeler à OpenSSL dans un autre processus:

require 'open3' 
Open3.popen3('openssl pkcs8 -topk8 -inform PEM -outform PEM -passout pass:password') do |stdin, stdout, stderr| 
    stdin.write(key.to_pem) 
    unless (err = stderr.read).empty? then raise err end 
    stdout.read 
end 

Il doit y avoir une meilleure façon que je ne peux pas trouver. Est-ce que la bibliothèque de classes OpenSSL de ruby ​​a un mécanisme pour le faire?

Répondre

0

Je pense que j'ai trouvé un moyen de le faire en piratant une nouvelle méthode à la classe OpenSSL :: PKey :: RSA qui sort au format PKCS # 8. Il est plutôt laid et pourrait utiliser un peu de nettoyage, mais parvient à créer des enregistrements valides:

key = OpenSSL::PKey::RSA.new(1024) 

key.to_pem_pkcs8 
# => "-----BEGIN PRIVATE KEY----- ..." 

Cette méthode fonctionne comme d'habitude, mais to_pem fait un appel à une méthode différente de l'exportateur de OpenSSL.

+0

Eh bien, avez-vous le code qui se trouve quelque part? EDIT: évidemment https://github.com/twg/openssl_pkcs8 –

+0

Ouais, c'est tout. Aussi emballé dans un [gem] (https://rubygems.org/gems/openssl_pkcs8) pour votre commodité. J'ai du mal à le faire fonctionner dans Ruby 2.0, cependant. – tadman

+1

@tadman J'ai mis à jour le code pour Ruby 2.2.1 et cela fonctionne comme un charme. Il y a une demande de traction sur votre gemme ici: https://github.com/twg/openssl_pkcs8/pull/4 –