NodeJS tls.connect () getPeerCertificate () возвращает ошибку (multi), но браузер показывает нормально - PullRequest
5 голосов
/ 07 мая 2020

Я создаю приложение-обходчик SSL, в котором пользователь передает имя домена, а NodeJS использует tls библиотеку для получения сертификата SSL.

Во-первых, вот мои коды:

server.js

const tls = require('tls');
var rootCas = require('ssl-root-cas/latest').create();
const fs = require('fs');

fs.readdirSync('./keys/intermediate_certs').forEach(file => {
    rootCas.addFile('./keys/intermediate_certs/' + file)
});

var secureContext = tls.createSecureContext({
    ca: rootCas
});

options = {
    host: host, //domain like google.com
    port: 443,
    secureContext: secureContext,
    ca: rootCas,
    rejectUnauthorized: true
};

var tlsSocket = tls.connect(options, function () {

   let rawCert = tlsSocket.getPeerCertificate()
   console.log(rawCert)
})

tlsSocket.on('error', (error) => {
   console.log(error)
   // [ERR_TLS_CERT_ALTNAME_INVALID] Hostname/IP does not match certificate's altnames: Host: zdns.cn. is not in the cert's altnames: DNS:*.fkw.com, DNS:fkw.com

   // unable to verify the first certificate or UNABLE_TO_VERIFY_LEAF_SIGNATURE
});

Проблема заключается в ошибке выдачи приложения nodejs, согласно документации TLS, ошибки были из OpenSSL, однако при просмотре веб-сайта отображается view certificate все допустимые (даже общее имя точно совпало).

Вот некоторые критерии:

  1. zdns.cn / www.zdns.cn показывает ошибку: ERR_TLS_CERT_ALTNAME_INVALID; При просмотре сертификата из браузера он показывает *.zdns.cn
  2. knet .cn / www.knet.cn показывает ошибку: unable to verify the first certificate; При просмотре сертификата в браузере отображается www.knet.cn

Примечание. Я включил последний root CA из ssl-root-cas, а также загрузил intermediate certificate вручную с сайта CA.

1 Ответ

0 голосов
/ 17 мая 2020

Вы получаете эту ошибку именно из-за вашего параметра rejectUnauthorized. Сертификат представляет *.fkw.com как CN, а *.fkw.com и fkw.com - как альтернативные имена. Ни один из них не соответствует zdns.cn или www.zdns.cn.

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

...