2016-11-29 63 views
0

我有p12文件,我应该得到X.509证书。为了与此文件的工作我用forge库:节点JS,如何从P12文件中提取X.509证书?

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

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

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

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

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

console.log(cert); 

控制台输出,以我这样的信息:

{ type: '1.2.840.113549.1.12.10.1.3', 
    attributes: 
    { localKeyId: [ 'aoa ??xx\u0015-?]%m§ §\f,\u0013' ], 
    friendlyName: [ 'e56fe5a0899f787815adaf5d256da7a0a70c2c13' ] }, 
    cert: null, 
    asn1: 
    { tagClass: 0, 
     type: 16, 
     constructed: true, 
     composed: true, 
     value: [ [Object], [Object], [Object] ] } } 

这一结果意味着,我有名字e56fe5a0899f787815adaf5d256da7a0a70c2c13的别名,但为什么certnull

有Java的安全API,它能够从该p12文件中提取X.509证书的别名。

X509Certificate x509Certificate = (X509Certificate) ks.getCertificate(alias); 

它是如何可能通过使用forgep12文件中提取X.509证书?

节点版本5.4.1

锻造版0.6.45

在那里,你可以下载我的测试中P12文件:link

密码是123456

+0

你能告诉这样的行为测试证书?哪个版本的'node.js'和'forge'库? –

+0

@ stdob--我已经更新了我的答案。至于显示证书,你的意思是上传'p12'文件? –

+0

是的,如果有可能的话。在我的环境中(节点5.4.1和伪造0.6.45),我的证书上的代码给出了正确的结果。 –

回答

1

根据[https://github.com/digitalbazaar/forge/issues/237#issuecomment-93555599]

如果伪造无法识别密钥格式,则密钥袋中的密钥属性 将返回null,并使用密钥的原始 ASN.1表示形式设置asn1属性。

所以,你需要convert to ASN.1, then DER, then PEM-encode

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);