2010-02-21 42 views
3

我創建了一個RSA私鑰紅寶石:OpenSSL的紅寶石:PKCS#8格式的私鑰

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

我可以在PEM或DER格式的關鍵是:

key.to_pem 
key.to_der 

但似乎沒有辦法將其轉換爲PKCS#8格式。我想出的最好的辦法是在另一個進程中呼叫openssl:

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 

必須有更好的方法,我找不到。 Ruby中的OpenSSL類庫是否有這樣的機制?

回答

0

我想我找到了一種方法來實現這一點,通過對OpenSSL :: PKey :: RSA類的新方法進行攻擊,該類以PKCS#8格式輸出。這是相當醜陋,並可以使用一些清理,但設法建立有效的記錄:

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

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

這種方法就像平常to_pem反而使得以不同的OpenSSL的出口方法的調用。

+0

好吧,你有代碼躺在某處嗎? 編輯:顯然https://github.com/twg/openssl_pkcs8 – 2013-03-01 16:42:30

+0

是的,就是這樣。爲了您的方便,還打包到[gem](https://rubygems.org/gems/openssl_pkcs8)。不過,我在使用Ruby 2.0時遇到了一些麻煩。 – tadman 2013-03-01 18:53:15

+1

@tadman我更新了Ruby 2.2.1的代碼,它的功能就像一個魅力。你的寶石上有一個拉動請求:https://github.com/twg/openssl_pkcs8/pull/4 – 2015-09-04 18:17:08