Tedious: tls.createSecurePair устарел во время выполнения

Созданный на 26 февр. 2017  ·  33Комментарии  ·  Источник: tediousjs/tedious

Ссылка: https://github.com/nodejs/node/pull/11349

Используется в:

tedious-1.14.0.tgz/lib/message-io.js:117:      this.securePair = tls.createSecurePair(credentials);

См. также №135.
См., например, https://github.com/sidorares/node-mysql2/pull/367 для примера обнаружения функции.

Самый полезный комментарий

738 содержит исправление, которое будет объединено и выпущено после проверки кем-то из команды @tediousjs/microsoft-contributors.

Все 33 Комментарий

@ChALkeR Спасибо за указатель. Это будет полезно, когда мы доберемся до этого. Не стесняйтесь присылать PR, если вы чувствуете вдохновение :-)

@tvrprasad : @ChALkeR является частью команды Node.js, и этот пост в основном предназначен для того, чтобы tedious . 😄

@ChALkeR : я знал об этом устаревании некоторое время, но документация по этому устареванию действительно скудна. Примеры, которые я видел до сих пор (например, PR для node-mysql ), сосредоточены на «простых» обновлениях TLS, когда соединение просто переключается с не-TLS на TLS.

В TDS обновление TLS гораздо более сложное, все пакеты квитирования должны быть завернуты в сообщения TDS, а затем, как только соединение будет установлено, все дальнейшие пакеты TLS больше не нужно заворачивать. Реализовать это через tls.createSecurePair было довольно просто, но в последний раз, когда я пробовал это через TLSSocket , я не смог заставить его работать. 😞

Я попробую еще раз, когда доберусь до этого, но я не думаю, что многое изменилось.

Еще одна проблема, с которой я столкнулся, заключается в том, что перенос сокета из пакета readable-stream пакет TLSSocket вызовет segfault (!) процесса Node.js. К сожалению, сейчас у меня нет под рукой шагов воспроизведения. 😞

@arthurschreiber Спасибо за информацию :-)

но в последний раз, когда я пробовал это через TLSSocket, я не мог заставить его работать.

Если эта работа находится на github, пожалуйста, пришлите мне указатель. Мне любопытно проверить это.

@tvrprasad @arthurschreiber Вот информация о том, как заменить tls.createSecurePair https://nodejs.org/dist/latest-v6.x/docs/api/tls.html#tls_class_securepair

Столкнулся с той же проблемой на Node v8.0.1. Мое приложение сообщает о следующей ошибке после попытки установить зашифрованное соединение:

(node:6344) [DEP0064] DeprecationWarning: tls.createSecurePair() is deprecated. Please use tls.Socket instead.

Я использую patriksimek/node-mssql и драйвер tedious (драйвер по умолчанию node-mssql ) для доступа к нашей базе данных Microsoft SQL Server.

Та же проблема, что и у @olange с использованием node-mssql с утомительным драйвером.

Listening on port 4000
(node:4402) [DEP0064] DeprecationWarning: tls.createSecurePair() is deprecated. Please use tls.Socket instead.

Пожалуйста, не поймите меня неправильно, и я очень ценю ваши усилия по поддержанию этого модуля, но есть ли прогноз, когда он будет исправлен?

Используя пакет «mssql» и используя параметры:
{
зашифровать: правда
}

(узел: 13508) [DEP0064] Предупреждение об устаревании: tls.createSecurePair() устарела. Вместо этого используйте tls.Socket.

Когда команда Node отказывается от чего-то подобного, каковы сроки удаления в Node? Просто любопытно.

Вероятно, она будет удалена в Node 9 или 10. Эта функция считается устаревшей как минимум 4 года назад. :-/ Это один из немногих популярных пакетов NPM, который до сих пор его использует.

У кого-нибудь из соавторов есть какие-либо сроки, когда изменение будет выпущено?

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

@Iiridayn Это было бы здорово!
Я посмотрел на это, но не смог понять, как получить пакет рукопожатия от TLSSocket, застрявший в той же точке, что и https://github.com/tediousjs/tedious/issues/515#issuecomment -283191248 :confused:
Хотелось бы услышать, есть ли у вас идеи на этот счет.

Есть прогресс в этом? Я столкнулся с той же проблемой, пытаясь подключиться к Azure, если это поможет.
Я был бы признателен, если бы кто-нибудь быстро объяснил мне, что является последствием запуска приложения, когда оно устарело, SQL-запросы, которые я запрашиваю, не выполняются, и мне нужно знать, является ли это причиной, но тексты об этом я' я читал, не очень красноречивы.

Заранее спасибо.

@Jorgeee1 Jorgeee1 Это всего лишь предупреждение, вряд ли это будет причиной ваших проблем. Я также использую утомительный для подключения к Azure DB, и он работает нормально.

Я написал быстрое доказательство концепции замены createSecurePair на TLSSocket + TCP-сервер для получения необработанных данных рукопожатия. Вы можете взглянуть на это здесь . Интеграционные тесты, которые я мог запустить, прошли.

Это, очевидно, не является реальным решением проблемы (если только есть лишние розетки и т. Д.). Это скорее повод для обсуждения. Было бы хорошо иметь реальные предложения и обсуждения на https://github.com/nodejs/help/issues/1010.

@joux3 круто 😃 Можешь сделать пиар? Там будет легче рассмотреть и обсудить.

Тяжелые проекты не полегчали, добавился третий, и мы тоже мигрировали на MySQL. Извините, я не смогу исправить это - удачи вам :).

Пожалуйста, исправьте, это важная проблема

Привет всем,

позвольте мне дать краткое обновление текущего статуса здесь. Я понимаю, что сообщение об устаревании может быть неприятностью, но на самом деле это не проблема. tls.createSecurePair может быть устаревшим, но в краткосрочной и среднесрочной перспективе он никуда не денется. Согласно https://github.com/nodejs/node/pull/17882 , он не будет удален в ближайшее время.

Кроме того, https://github.com/nodejs/node/pull/17882 предлагает повторную реализацию tls.createSecurePair с точки зрения общедоступного API node.js, вводя (на данный момент) внутренний DuplexSocket класс. Основы этой реализации — это именно то, что нам нужно, чтобы утомительно уйти от tls.createSecurePair , не прибегая к интересным 😁, но не очень жизнеспособным хакам, предложенным @joux3. Нам, вероятно, придется создать нашу собственную версию DuplexSocket на данный момент, но, по крайней мере, теперь у меня есть хорошая идея о том, как решить эту утомительную проблему, когда станет ясно, когда tls.createSecurePair действительно будет удален. .

Пожалуйста, сообщите нам свое мнение! 😄

@arthurschreiber Fwiw, я также только что опубликовал эту реализацию DuplexPair на https://www.npmjs.com/package/duplexpair. Я думаю, вы могли бы создать оболочку вокруг этого, чтобы довольно легко получить двойника tls.createSecurePair() ?

@addaleax Сладко! ❤️ Это здорово, и я посмотрю, смогу ли я подключить это и заставить нас уйти от tls.createSecurePair раньше, чем позже! Большое спасибо! 🙇

@arthurschreiber Я думаю, что патч для этого может выглядеть так же просто:

diff --git a/package.json b/package.json
index bca5b266849d..8cc0ed957577 100644
--- a/package.json
+++ b/package.json
@@ -43,6 +43,7 @@
     "babel-runtime": "^6.26.0",
     "big-number": "0.3.1",
     "bl": "^1.2.0",
+    "duplexpair": "^1.0.1",
     "iconv-lite": "^0.4.11",
     "readable-stream": "^2.2.6",
     "sprintf": "0.1.5"
diff --git a/src/message-io.js b/src/message-io.js
index 6c2a15c32a9f..a1de3a1e91c0 100644
--- a/src/message-io.js
+++ b/src/message-io.js
@@ -1,7 +1,9 @@
+'use strict';
 const tls = require('tls');
 const crypto = require('crypto');
 const EventEmitter = require('events').EventEmitter;
 const Transform = require('readable-stream').Transform;
+const DuplexPair = require('duplexpair');

 const Packet = require('./packet').Packet;
 const TYPE = require('./packet').TYPE;
@@ -84,10 +86,14 @@ module.exports = class MessageIO extends EventEmitter {
   startTls(credentialsDetails, hostname, trustServerCertificate) {
     const credentials = tls.createSecureContext ? tls.createSecureContext(credentialsDetails) : crypto.createCredentials(credentialsDetails);

-    this.securePair = tls.createSecurePair(credentials);
+    const duplexpair = new DuplexPair();
+    this.securePair = {
+      cleartext: new tls.TLSSocket(duplexpair.socket1),
+      encrypted: duplexpair.socket2
+    };
     this.tlsNegotiationComplete = false;

-    this.securePair.on('secure', () => {
+    this.securePair.cleartext.on('secure', () => {
       const cipher = this.securePair.cleartext.getCipher();

       if (!trustServerCertificate) {

Но это, похоже, не тестируется как часть обычного набора тестов, поэтому я не уверен, как это сделать…

Я еще раз попытался заменить SecurePair. Интеграционные тесты, кажется, в порядке, протестированы на Node 9. https://github.com/joux3/tedious/commit/6d255fbdaa2f9afd388617e6e34815cae95292a0

Тем не менее, у меня есть некоторые наблюдения (но, может быть, патч достаточно хорош для PR, чтобы обсудить проблемы?):

  • Node.js 6, кажется, полностью падает на Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1517.
  • Мне пришлось удалить подделку таймера из теста тайм-аута повторной попытки, фальшивый таймер, похоже, внутренне ломает DuplexPair.
  • Я не тестировал незашифрованные соединения. На них могут повлиять изменения логического потока (похоже, что сигналы не распространяются правильно по каналам, поэтому на сокете есть ручной обработчик close )».

Огромное спасибо @addaleax за вашу работу!

@joux3 готов https://github.com/patriksimek/node-mssql/, спасибо!

Мне пришлось удалить подделку таймера из теста тайм-аута повторной попытки, фальшивый таймер, похоже, внутренне ломает DuplexPair.

@joux3 Какой это будет тест? (Извините, я не особо знаком с этой кодовой базой, кроме того, что я просмотрел для этой проблемы)

@addaleax , неудачный тест https://github.com/tediousjs/tedious/blob/f5a0f95a5a522ad6a312170201b829e70c866976/test/integration/connection-retry-test.js#L73 -L104
Отключение таймера здесь: https://github.com/tediousjs/tedious/pull/689/files#diff -ed1dc3ba8a10a8fb4b18a528b35bad00.
Редактировать: я восстановил подделку таймера, подделав только setTimeout https://github.com/tediousjs/tedious/pull/689/commits/ff5d5eb1a3603db05266306a823fa49a98b50209.

@jimmont , я открыл запрос на вытягивание по адресу https://github.com/tediousjs/tedious/pull/689 (похоже, ссылки на идентификатор задачи в имени PR недостаточно...). Интеграционные тесты проходят на Node 8, но есть еще над чем поработать.

👍 Чтобы исправить это как можно скорее!

Есть ли прогресс в этом? Будет хорошо, если мы сможем получить обновленную информацию по этому вопросу.

Привязка PR #689 для отслеживания.

В мире, где предупреждения отправляются на стандартный вывод вместо стандартного вывода. <fail/>

любое обновление?

738 содержит исправление, которое будет объединено и выпущено после проверки кем-то из команды @tediousjs/microsoft-contributors.

После долгих размышлений это было наконец (и должным образом) исправлено через https://github.com/tediousjs/tedious/pull/738. [email protected] теперь доступен в npm. В настоящее время он помечен как next и я позабочусь о том, чтобы в ближайшее время он был помечен как latest .

Спасибо всем за терпение и помощь в исправлении ошибки! 🙇

Была ли эта страница полезной?
0 / 5 - 0 рейтинги