【问题标题】:Node JS, how to extract X.509 Certificate from P12 file?Node JS,如何从 P12 文件中提取 X.509 证书?
【发布时间】:2017-04-13 08:36:23
【问题描述】:

我有 p12 文件,我应该在其中获得 X.509 证书。为了使用这个文件,我使用forge library:

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

【问题讨论】:

  • 你能出示这种行为的测试证书吗? node.jsforge 库的哪个版本?
  • @stdob--我已经更新了我的答案。至于显示证书,你的意思是上传p12文件?
  • 是的,如果可能的话。在我的环境(节点 5.4.1 和 forge 0.6.45)中,我证书上的代码给出了正确的结果。
  • @stdob-- 我已经更新了我的问题。

标签: javascript node.js security encryption x509


【解决方案1】:

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

如果 forge 无法识别密钥格式,它将返回 null 密钥包中的 key 属性,并使用 raw 设置 asn1 属性 密钥的 ASN.1 表示。

所以,你需要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);

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 2014-05-13
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    相关资源
    最近更新 更多