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 格式验证证书的主要内容,如果未能解决你的问题,请参考以下文章

openssl制作证书全过程及https实现

Java X509 证书解析和验证

通过 CLI 针对 Java 证书存储验证证书

如何编程读取PKCS#12格式的证书与私钥

证书编码格式

错误:无法验证nodejs中的第一个证书