9

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

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

更新:这与 HTTPS 证书无关。这是关于一般的 X.509 证书。如果您将问题标记为否定,请发表评论以证明其合理性。如果您无法提供帮助,请不要愚蠢。

4

3 回答 3

14

我认为 PEM 格式只是经过 base64 编码的 DER 二进制数据,分成 64 个字符行,并包裹在 '-----BEGIN CERTIFICATE-----' 和 '-----END 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缓冲区的最后一个匹配应该是一个空字符串'',所以在末尾会有一个'\n'derBuffer.toString('base64').match(/.{0,64}/g).join('\n')

于 2018-01-17T20:52:19.993 回答
3

这是一种方法:

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

于 2015-08-15T19:06:39.190 回答
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' });
});
于 2015-10-20T17:25:23.067 回答