TLSSocket не сообщает об авторизации и ошибке authorizationError - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь установить TLSSocket соединение с сервером Electrum в Node. Для этого я хочу разрешить самоподписанные сертификаты, но я хочу уведомлять / регистрировать, когда соединение использует самоподписанный сертификат.

Чтобы разрешить самоподписанные сертификаты, я использую опцию rejectUnauthorized: false при подключении. Это работает, как ожидалось. Однако в соответствии с документами Node TLS подключенный сокет должен сообщать как флаг authorized, так и authorizationError, когда авторизация не выполняется. Похоже, об этом сообщается неправильно.

Это простой пример кода, демонстрирующий мою проблему:

const tls = require('tls');

// const host = 'bch.imaginary.cash';
const host = 'electroncash.de'
const port = 50002;

const socket = tls.connect(port, host, { rejectUnauthorized: false });

socket.on('error', console.log);

socket.on('connect', () => {
  console.log(`Successfully connected to ${host}:${port}`);
  console.log(socket.authorized);
  console.log(socket.authorizationError);
})

Я запускал этот код на двух разных серверах: bch.imaginary.cash который имеет сертификат, подписанный ЦС, и electroncash.de с самоподписанным сертификатом. При запуске этого кода с rejectUnauthorized, установленным на false, оба хоста приводят к следующему:

Successfully connected to electroncash.de:50002
false
null

Я ожидал, что соединение, подписанное CA, сообщит authorized как true, и я ожидал бы самоподписанное соединение, чтобы сообщить authorizationError как ненулевое.

Я также попытался запустить тот же код с rejectUnauthorized, установленным на true, и в этом случае соединение с CA-подписью прошло успешно (но все еще authorized установлено на false), и самоподписанное соединение привело к ошибке:

Error: self signed certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1501:34)
    at TLSSocket.emit (events.js:315:20)
    at TLSSocket._finishInit (_tls_wrap.js:936:8)
    at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:710:12) {
  code: 'DEPTH_ZERO_SELF_SIGNED_CERT'
}

1 Ответ

0 голосов
/ 04 августа 2020

Я долго боролся с этой проблемой, прежде чем начать набирать этот вопрос. После того, как я написал полный вопрос, я понял ответ, поэтому я решил все же опубликовать вопрос и предоставить ответ сам.

Событие 'connect' на TLSSocket наследуется от незашифрованного net.Socket. Так что в данном случае это неподходящее событие для прослушивания. Вместо этого вы должны прослушивать событие 'secureConnect'. Когда мы меняем код прослушивателя событий в исходном вопросе на:

socket.on('secureConnect', () => {
  console.log(`Successfully connected to ${host}:${port}`);
  console.log(socket.authorized);
  console.log(socket.authorizationError);
})

Результаты точно такие, как ожидалось. Другими словами, подписанное CA соединение сообщает true и null, а самоподписанное соединение сообщает false и DEPTH_ZERO_SELF_SIGNED_CERT.

...