从p12 node-forge获取证书正文和私钥

时间:2019-02-28 08:20:05

标签: node.js

我正在尝试从node-forge的p12实例中获取证书正文和密钥(PEM格式)。

I saw this answer到一个类似的问题,但由于某种原因,它对我不起作用。

var forge = require('node-forge');
var fs = require('fs');

var keyFile = fs.readFileSync("./gost.p12", 'binary');
var p12Asn1 = forge.asn1.fromDer(keyFile);

var p12 = forge.pkcs12.pkcs12FromAsn1(p12Asn1, '123456');

var bags = p12.getBags({bagType: forge.pki.oids.certBag});

var bag = bags[forge.pki.oids.certBag][0];

// convert to ASN.1, then DER, then PEM-encode
var msg = {
  type: 'CERTIFICATE',
  body: forge.asn1.toDer(bag.asn1).getBytes()
};
var pem = forge.pem.encode(msg);

console.log(pem);

bag.asn1不在bag实例上。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您知道.p12文件中使用了哪种私钥,则任务会简单得多:

1)对于RSA密钥,您可以通过example从“ node-forge”的官方存储库中从“ p12”对象获取私钥:

// get key bags
var bags = p12.getBags({bagType: forge.pki.oids.keyBag});
// get key
var bag = bags[forge.pki.oids.keyBag][0];
var key = bag.key;

2)就我而言,它是PKCS8密钥。要获得它,您可以使用来自“ node-forge”问题的example

var keyBags = p12.getBags({bagType: forge.pki.oids.pkcs8ShroudedKeyBag});
var bag = keyBags[forge.pki.oids.pkcs8ShroudedKeyBag][0];
var privateKey = bag.key;

3)根据以下未解决的问题,如果没有ECC密钥,则“ node-forge”不是一个选项:"PKCS12 to PEM"

  

不幸的是,我们还没有为ECC密钥(只有RSA密钥)实现ASN.1解析。 Forge具有ed25519的实现,但仅使用原始(更简单)的格式。欢迎公关!