【问题标题】:NodeJS: Validate certificate in DER formatNodeJS:以 DER 格式验证证书
【发布时间】:2015-11-06 16:40:19
【问题描述】:

我正在使用crypto 模块来验证证书,但我的证书和公钥都是DER 格式。 crypto 模块似乎不接受这种格式。

有没有办法(或模块)使用 NodeJS 将 DER 转换为 PEM 格式?我找不到任何东西,也无法使用命令行通过 shell 调用 openssl

更新:这与 HTTPS 证书无关。这是关于一般的 X.509 证书。如果您将问题标记为否定,请发表评论以证明其合理性。帮不上忙也别傻了。

【问题讨论】:

  • 如果我是你,我会省略“更新”部分。

标签: javascript node.js cryptography der


【解决方案1】:

这是一种方法:

function derToPem(der) {
	var forge = require("node-forge");
	var derKey = forge.util.decode64(der);
	var asnObj = forge.asn1.fromDer(derKey);
	var asn1Cert = forge.pki.certificateFromAsn1(asnObj);
	return forge.pki.certificateToPem(asn1Cert);
};

【讨论】:

  • 不错的尝试,但它不支持公钥的 ECDSA。
【解决方案2】:

Dominykas 的回答很好,但就我而言,我有一个使用 ECC 的证书,而 node-forge 不支持它。 所以我找到了一个名为 node-openssl-wrapper 的模块,它运行良好,因为它将 openssl 命令封装在一个简单的函数调用中,如下所示:

co(function*() {
  var ossl = require('openssl-wrapper');
  var derCert = new Buffer('...'); // binary DER certificate
  var pemCert = yield ossl.qExec('x509', derCert, { inform: 'der', outform: 'pem' });
});

【讨论】:

  • 我认为这个答案对我有用,但是当我在 crypto.publicDecrypt(pemkey, cipherText) 中使用这个 pemCert 时,它说: (pemkey) 不是缓冲区。任何想法?提前非常感谢。 @blzn
  • 也许你应该试试crypto.publicDecrypt(new Buffer(pemkey), cipherText)
【解决方案3】:

我认为 PEM 格式只是经过 base64 编码的 DER 二进制数据,分成 64 个字符行,并包裹在 '-----BEGIN CERTIFICATE-----' 和 '-----结束证书-----'。

所以你可以这样做:

var prefix = '-----BEGIN CERTIFICATE-----\n';
var postfix = '-----END CERTIFICATE-----';
var pemText = prefix + derBuffer.toString('base64').match(/.{0,64}/g).join('\n') + postfix;

你不需要在后缀之前放一个'\n',因为der缓冲区的最后一个匹配应该是一个空字符串'',所以@987654322的末尾会有一个'\n'@

【讨论】:

  • 太棒了,这应该是答案。适用于任何 DER 到 PEM,例如 X509 CRL
猜你喜欢
  • 2022-06-23
  • 2012-12-08
  • 2021-02-12
  • 2018-12-28
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多