将PKCS#8二进制密钥加载到Ruby中

8

我正在尝试将一个以二进制DER格式(PKCS#8)编码的特定私钥加载到Ruby中。

然而,OpenSSL::PKey无法识别它。我可以通过一些控制台操作并将其转换为PEM来使其工作,如下所示:

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

接下来,密钥可以被正确读取。

然而,由于我希望整个过程在内存中完成,而不是写入和读取文件。

所以我的问题是:是否可能将二进制编码的 DER 格式的私钥加载到 Ruby/OpenSSL 中?

感谢您的时间,

Fernando

2个回答

4

是的,您可以使用Ruby OpenSSL间接加载PKCS#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 标签,然后加载密钥。


0
证书可以处理DER编码的证书和OpenSSL的PEM格式编码的证书。
您可以在此处找到有关Ruby OpenSSL实现的文档here

这是不正确的。对于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, version, LONG), ...),它将不会读取PKCS#8。 DER编码的PKCS#8 不能直接使用OpenSSL::PKey::RSA.new加载。 - Jim Flood
我的错。我不知道Ruby中OpenSSL的实现与OpenSSL文档中所说的不同... - Camille G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接