NodeJS:以 DER 格式验证证书
Posted
技术标签:
【中文标题】NodeJS:以 DER 格式验证证书【英文标题】:NodeJS: Validate certificate in DER format 【发布时间】:2015-11-06 16:40:19 【问题描述】:我正在使用crypto
模块来验证证书,但我的证书和公钥都是DER 格式。 crypto
模块似乎不接受这种格式。
有没有办法(或模块)使用 NodeJS 将 DER 转换为 PEM 格式?我找不到任何东西,也无法使用命令行通过 shell 调用 openssl。
更新:这与 HTTPS 证书无关。这是关于一般的 X.509 证书。如果您将问题标记为否定,请发表评论以证明其合理性。帮不上忙也别傻了。
【问题讨论】:
如果我是你,我会省略“更新”部分。 【参考方案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以上是关于NodeJS:以 DER 格式验证证书的主要内容,如果未能解决你的问题,请参考以下文章