如何使用 Nodejs 获取有关完整证书链的信息?

Gre*_*orp 1 ssl certificate node.js

我正在节点中创建一个服务来验证我们公司依赖的所有域的所有证书的状态。最初我们只关心到期日期,但稍后可能需要更多信息。我可以通过以下方式检索最低级别证书的适当详细信息

var https = require('https');

var options = {
    host: 'google.com',
    port: 443,
    method: 'GET'
};

const request = https.request(options, function(res) {
    console.log(res.connection.getPeerCertificate());
});

request.end();
Run Code Online (Sandbox Code Playgroud)

但我希望获得证书链中每个证书的详细信息。这在nodejs中怎么可能?

即对于 google.com,我想获得每个的完整详细信息

Google Trust Services - GlobalSign CA-R2   ->   GTS CA 101  ->    www.google.com 
Run Code Online (Sandbox Code Playgroud)

我想我可以递归地调用每个证书的颁发者,但不太确定如何或是否可能。

jfr*_*d00 6

根据doc,如果你true像这样通过:

res.connection.getPeerCertificate(true)
Run Code Online (Sandbox Code Playgroud)

然后,您将获得有关整个链条的详细信息。当请求完整的证书链时,每个证书都将包含一个issuerCertificate属性,该属性包含一个代表其颁发者证书的对象,您可以使用它来跟踪链。下面是一个例子:

var https = require('https');

var options = {
    host: 'google.com',
    port: 443,
    method: 'GET'
};

const request = https.request(options, function(res) {
    let cert = res.connection.getPeerCertificate(true);
    let list = new Set(); 
    do {
        list.add(cert);
        console.log("subject", cert.subject);
        console.log("issuer", cert.issuer);
        console.log("valid_from", cert.valid_from);
        console.log("valid_to", cert.valid_to);
        cert = cert.issuerCertificate;
    } while (cert && typeof cert === "object" && !list.has(cert));

    res.on('data', data => {
        //console.log(data.toString('utf8'));
    });
});

request.end();
Run Code Online (Sandbox Code Playgroud)

该文档没有解释您如何知道您何时处于链的末端(我原以为它会由null颁发者表示,但console.log()报告了循环引用,因此我添加了一个Set来跟踪我们看到的证书到目前为止,为了检测链何时变为循环以知道何时停止跟随链。