使用node.js通过CA证书验证X509证书

use*_*955 10 verification ssl certificate ca node.js

我正在寻找一种使用提供给我的CA证书来验证X509格式的客户端证书的node.js方法(这些证书都不是由我创建/管理的,我的软件只需要验证发送给它的蜜蜂) 。

我已经找到了完成这项工作的几个模块,但是每个模块都有问题:

  • X509可以使用进行操作x509.verify(cert, CABundlePath, cb),但是它需要从FS读取证书,而且我已经将它们存储在内存中了。这很麻烦,因为到达我应用程序的每个Web请求都将完成此操作。
  • 看起来PKI.js可以做到,但是他们的示例对我不起作用,但抱怨文件丢失,因此我什至无法尝试。
  • 我尝试了node-forge,但是虽然我不确定我是否正确使用了它们(它们没有任何API文档),但它forge.pki.BadCertificate从抛出了一个错误forge.pki.verifyCertificateChain(caStore, [ cer ], cb)
  • 当尝试使用pem时,使用简单的方法pem.verifySigningChain(cer, [ ca ], cb)会抱怨在从中加载文件时会出错/var/...。即使可行,我也会避免使用此lib作为依赖openssl命令行工具的方式,我想避免

现在,我感到非常愚蠢,因为我无法通过上述任何模块来完成此简单任务。有人可以给我指出一个简单的解决方案,该解决方案可以让我使用给定的CA证书来验证X509证书的签名/有效性吗?:s

[编辑]基本上,我需要openssl verify -verbose -CAfile ca-crt.pem client1-crt.pemNode.js,但依赖于OpenSSL的命令行工具,并没有该证书暂时保存到磁盘。

[edit2]是否可以仅使用https://nodejs.org/api/crypto.html#crypto_verify_verify_object_signature_signatureformat

use*_*955 5

我终于设法使用做到了node-forge。这是一个工作代码示例:

let pki = require('node-forge').pki;
let fs = require('fs');

let caCert;
let caStore;

try {
    caCert = fs.readFileSync('path/to/ca-cert.pem').toString();
    caStore = pki.createCaStore([ caCert ]);
} catch (e) {
    log.error('Failed to load CA certificate (' + e + ')');
    return....;
}

try {
    pki.verifyCertificateChain(caStore, [ cert ]);
} catch (e) {
    return handleResponse(new Error('Failed to verify certificate (' + e.message || e + ')'));
}
Run Code Online (Sandbox Code Playgroud)

两种证书均应以base64编码的PEM格式/ js字符串给出。

verifyCertificateChain检查证书的有效性(notBefore/ notAfter)并验证给定的CA链。

我不是100%肯定这是最好的方法,还是该库是否做得很好,因为它们的源代码中verifyCertificateChain充满了#TODOs,所以也许还没有准备好投入生产?但至少我有一个可行的解决方案。创建一个包装libsslc调用的节点模块可能会更好,但是对于这个小任务来说,这只是很多工作。