2011-01-20 55 views
5

我試圖在Ruby中加載以二進制DER格式(PKCS#8)編碼的特定私鑰。將PKCS#8二進制密鑰加載到Ruby中

但是,OpenSSL::PKey將不會識別它。我可以把它做一些控制檯的工作,並將其轉化成PEM像這樣的工作:

openssl pkcs8 -inform DER -in file.key -passin pass:xxxxxxxx >private_key.pem 

在此之後,鍵可以正確讀取。

但是,因爲我希望整個過程在內存中完成,而不是寫入和讀取文件。

所以我的問題是:是否有可能將二進制編碼的DER格式的私鑰加載到Ruby/OpenSSL中?

謝謝您的時間,

費爾南多

回答

0

證書能夠處理在OpenSSL的PEM格式編碼的DER編碼證書和證書。

你可以對Ruby here找到有關OpenSSL實現文檔:

+0

這是不正確的。對於PEM,Ruby源代碼調用PEM_read_bio_RSAPrivateKey,它調用PEM_read_bio_PrivateKey,它是,處理PKCS#8。但是,在DER時,Ruby源調用d2i_RSAPrivateKey_bio,它調用ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPrivateKey),bp,rsa)(openssl-1.0.1m/crypto/rsa/rsa_asn1.c:ASN1_SEQUENCE_cb(RSAPrivateKey,rsa_cb)= {ASN1_SIMPLE(RSA ,版本,LONG),...),它將*不*讀取PKCS#8。 DER編碼的PKCS#8 *不能*使用OpenSSL :: PKey :: RSA.new直接加載。 – 2015-09-23 22:39:18

2

是的,你可以間接負載PKCS#使用Ruby OpenSSL的8 DER編碼的私鑰。

OpenSSL::PKey::RSA.new只能處理PEM格式的PKCS#8,但很容易讀取二進制DER並將其轉換爲PEM格式的字符串,然後從字符串中加載。

例如,對於這些DER編碼的私鑰:

$ openssl genrsa | openssl pkcs8 -topk8 -outform DER \ 
    -nocrypt -out pkcs8.key 
$ openssl genrsa | openssl pkcs8 -topk8 -outform DER \ 
    -v2 des3 -passout pass:secret -out pkcs8_des3.key 

你可以做這樣的事情:

require 'openssl' 
require 'base64' 

def box(tag, lines) 
    lines.unshift "-----BEGIN #{tag}-----" 
    lines.push "-----END #{tag}-----" 
    lines.join("\n") 
end 

def der_to_pem(tag, der) 
    box tag, Base64.strict_encode64(der).scan(/.{1,64}/) 
end 

pem = der_to_pem('PRIVATE KEY', File.read('pkcs8.key')) 
key = OpenSSL::PKey::RSA.new(pem) 

pem2 = der_to_pem('ENCRYPTED PRIVATE KEY', File.read('pkcs8_des3.key')) 
key2 = OpenSSL::PKey::RSA.new(pem2, 'secret') 

閱讀DER字節的Base64他們,把PEM標籤之上和底部,然後加載密鑰。