Node.js 从p12节点forge获取证书正文和私钥

Node.js 从p12节点forge获取证书正文和私钥,node.js,Node.js,我正试图从NodeForge的p12实例中获取证书体和密钥(PEM格式) 对于一个类似的问题,但出于某种原因,它不适合我 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.pkcs12F

我正试图从NodeForge的p12实例中获取证书体和密钥(PEM格式)

对于一个类似的问题,但出于某种原因,它不适合我

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实例上存在的东西


有什么想法吗?

如果您知道.p12文件中使用了哪种私钥,这将是一项简单得多的任务:

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

2) 就我而言,这是PKCS8密钥。要获得它,您可以使用“节点锻造”问题:

3) 对于ECC密钥,根据以下未决问题,“节点锻造”不是选项:

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

// 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;
var keyBags = p12.getBags({bagType: forge.pki.oids.pkcs8ShroudedKeyBag});
var bag = keyBags[forge.pki.oids.pkcs8ShroudedKeyBag][0];
var privateKey = bag.key;