2016-11-29 200 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);