我正在使用crypto
模块来验证证书,但是我的证书和我的公钥都是DER格式。该crypto
模块似乎不接受这种格式。
有没有办法(或模块)使用 NodeJS 将 DER 转换为 PEM 格式?我找不到任何东西,也无法使用命令行通过 shell调用openssl 。
更新:这与 HTTPS 证书无关。这是关于一般的 X.509 证书。如果您将问题标记为否定,请发表评论以证明其合理性。如果您无法提供帮助,请不要愚蠢。
我正在使用crypto
模块来验证证书,但是我的证书和我的公钥都是DER格式。该crypto
模块似乎不接受这种格式。
有没有办法(或模块)使用 NodeJS 将 DER 转换为 PEM 格式?我找不到任何东西,也无法使用命令行通过 shell调用openssl 。
更新:这与 HTTPS 证书无关。这是关于一般的 X.509 证书。如果您将问题标记为否定,请发表评论以证明其合理性。如果您无法提供帮助,请不要愚蠢。
我认为 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')
这是一种方法:
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);
};
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' });
});