Как я могу получить информацию по всей цепочке сертификатов с Nodejs? - PullRequest
1 голос
/ 16 января 2020

Я создаю сервис в узле для проверки статусов всех сертификатов для всех доменов, от которых зависит наша компания. Изначально нас интересуют только даты истечения срока действия, но позже нам может понадобиться дополнительная информация. Я могу получить соответствующие данные для сертификата самого низкого уровня с помощью

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();

, но я хочу получить подробную информацию для каждого сертификата в цепочке сертификатов. Как это возможно в nodejs?

т.е. для google.com я хотел бы получить полную подробную информацию по каждому из

Google Trust Services - GlobalSign CA-R2   ->   GTS CA 101  ->    www.google.com 

Я думаю, что могу рекурсивно совершать звонки эмитенту каждого сертификата, но не совсем уверен, как или если это возможно.

1 Ответ

3 голосов
/ 16 января 2020

За дел c, если вы передадите true следующим образом:

res.connection.getPeerCertificate(true)

Затем вы получите подробную информацию о всей цепочке. Когда запрашивается полная цепочка сертификатов, каждый сертификат будет содержать свойство 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();

do c не объясняет, как вы узнаете, когда находитесь в конце цепочки (я бы подумал, что это будет обозначено эмитентом null, но console.log() сообщил о циклической ссылке, поэтому я добавил Set, чтобы отслеживать сертификаты, которые мы видели до сих пор, чтобы определить, когда цепь стала круговой, чтобы знать, когда прекратить следовать за цепочкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...