Tedious: tls.createSecurePair está en desuso en tiempo de ejecución

Creado en 26 feb. 2017  ·  33Comentarios  ·  Fuente: tediousjs/tedious

Referencia: https://github.com/nodejs/node/pull/11349

Utilizado en:

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

Ver también #135.
Consulte, por ejemplo, https://github.com/sidorares/node-mysql2/pull/367 para ver un ejemplo de detección de características.

Comentario más útil

738 contiene una solución y se fusionará y publicará una vez que alguien del equipo de @tediousjs/microsoft-contributors lo revise.

Todos 33 comentarios

@ChALkeR Gracias por el puntero. Esto será útil cuando lleguemos a esto. Siéntase libre de enviar un PR si se siente inspirado :-)

@tvrprasad : @ChALkeR es parte del equipo de Node.js y esta publicación está pensada principalmente como un tedious . 😄

@ChALkeR : node-mysql ) se enfocan en actualizaciones TLS "simples", donde la conexión simplemente se cambia de no TLS a TLS.

En TDS, la actualización de TLS es mucho más complicada, todos los paquetes de protocolo de enlace deben envolverse en mensajes TDS y luego, una vez que se establece la conexión, todos los paquetes TLS adicionales ya no necesitan envolverse. Implementar esto a través de tls.createSecurePair fue bastante sencillo, pero la última vez que lo probé a través de TLSSocket , no pude hacerlo funcionar. 😞

Lo intentaré de nuevo cuando llegue a él, pero no creo que haya cambiado mucho.

Otro problema con el que me encontré es que envolver un socket del paquete readable-stream en un TLSSocket causaría una falla de segmento (!) del proceso de Node.js. Desafortunadamente, no tengo los pasos de reproducción a mano en este momento. 😞

@arthurschreiber Gracias por la información :-)

pero la última vez que probé esto a través de TLSSocket, no pude hacerlo funcionar.

Si este trabajo está en github, envíeme un puntero. Tengo curiosidad por comprobarlo.

@tvrprasad @arthurschreiber Aquí hay información sobre cómo reemplazar tls.createSecurePair https://nodejs.org/dist/latest-v6.x/docs/api/tls.html#tls_class_securepair

Encontré el mismo problema en Node v8.0.1. Mi aplicación informa el siguiente error después de intentar establecer una conexión cifrada:

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

Estoy usando patriksimek/node-mssql y el controlador tedious (el controlador predeterminado de node-mssql ) para acceder a nuestra base de datos de Microsoft SQL Server.

El mismo problema que @olange usando node-mssql con un controlador tedioso.

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

Por favor, no me malinterpreten y realmente aprecio sus esfuerzos para mantener este módulo, pero ¿hay alguna predicción de cuándo se solucionará?

Usando el paquete 'mssql' y usando opciones:
{
cifrar: verdadero
}

(nodo: 13508) [DEP0064] Advertencia de desuso: tls.createSecurePair() está en desuso. Utilice tls.Socket en su lugar.

Cuando el equipo de Node desaprueba algo como esto, ¿cuál es el plazo para la eliminación en Node? Sólo curioso.

Probablemente se eliminará en el nodo 9 o 10. La función ha quedado en desuso durante al menos 4 años. :-/ Este es uno de los únicos paquetes populares de NPM que todavía lo usan.

¿Alguien de los colaboradores tiene algún cronograma sobre cuándo se lanzará el cambio?

Recibiendo esto hoy ya que acabo de actualizar nuestros sistemas al nodo 8.9.0 lts. Tengo dos proyectos pesados ​​en este momento, pero si ambos se relajan, veré si puedo dedicar algo de tiempo a arreglar esto.

@Iiridayn ¡ Eso sería genial!
Lo miré, pero no pude averiguar cómo obtener el paquete de protocolo de enlace de TLSSocket, atascado en el mismo punto que https://github.com/tediousjs/tedious/issues/515#issuecomment -283191248 :confused:
Me encantaría saber si tienes ideas al respecto.

¿Algún progreso en eso? Estoy enfrentando el mismo problema al intentar conectarme a Azure, solo si ayuda.
Agradecería que alguien me explicara rápidamente cuál es la consecuencia de ejecutar una aplicación mientras está en desuso, las consultas SQL que solicito no se ejecutan y necesito saber si esta es la causa, pero los textos en este I' he leído no son muy elocuentes.

Gracias de antemano.

@ Jorgeee1 Esto es solo una advertencia, es poco probable que sea el motivo de su problema. También estoy usando tedious para conectarme a Azure DB y funciona bien.

Escribí una prueba de concepto rápida para reemplazar createSecurePair con TLSSocket + un servidor TCP para obtener los datos del protocolo de enlace sin procesar. Puedes echarle un vistazo aquí . Las pruebas de integración que pude ejecutar pasaron.

Obviamente, esto no es una solución real para el problema en cuestión (a menos que comer enchufes adicionales, etc. esté bien). Esto es más un tema de discusión. Sería bueno tener sugerencias y discusiones reales en https://github.com/nodejs/help/issues/1010.

@ joux3 eso es increíble 😃 ¿Puedes crear un PR? Será más fácil revisar y discutir allí.

Los proyectos pesados ​​no han disminuido, se ha agregado un tercero y también hemos migrado a MySQL. Lo siento, no podré arreglar esto. La mejor de las suertes para ti :).

Por favor solucionenlo, es un problema importante

Hola a todos,

permítanme darles una actualización rápida sobre el estado actual aquí. Entiendo que el mensaje de desaprobación puede ser una molestia, pero en realidad no es un problema. tls.createSecurePair puede estar en desuso, pero para el futuro a corto y mediano plazo, no irá a ninguna parte. Según https://github.com/nodejs/node/pull/17882 , no se eliminará pronto.

Además, https://github.com/nodejs/node/pull/17882 propone una reimplementación de tls.createSecurePair en términos de la API pública de node.js, introduciendo (por ahora) un DuplexSocket interno tls.createSecurePair , sin recurrir a hacks interesantes 😁 pero no realmente viables como propone @joux3. Probablemente tendremos que crear nuestra propia versión de DuplexSocket por ahora, pero al menos ahora tengo una buena idea sobre cómo resolver esto en tedioso una vez que esté claro cuándo se eliminará realmente tls.createSecurePair .

¡Por favor dejanos saber lo que piensas! 😄

@arthurschreiber Fwiw, también acabo de publicar esa implementación de DuplexPair en https://www.npmjs.com/package/duplexpair. ¿Supongo que podrías construir un envoltorio alrededor de eso para tener un parecido a tls.createSecurePair() bastante facilidad?

@addaleax Dulce! ❤️ ¡Esto es genial y veré si puedo conectarlo y alejarnos de tls.createSecurePair más temprano que tarde! ¡Muchas gracias! 🙇

@arthurschreiber Creo que un parche para esto podría verse tan simple como esto:

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) {

Pero esto no parece ser probado como parte del conjunto de pruebas regular, así que no estoy seguro de cómo hacerlo...

Le di otra oportunidad de reemplazar SecurePair. Las pruebas de integración parecen estar bien, probadas en el Nodo 9. https://github.com/joux3/tedious/commit/6d255fbdaa2f9afd388617e6e34815cae95292a0

Sin embargo, tengo algunas observaciones (¿pero tal vez el parche sea lo suficientemente bueno para que un relaciones públicas discuta los problemas?):

  • Node.js 6 parece fallar totalmente en Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1517.
  • Tuve que eliminar la falsificación del temporizador de la prueba de tiempo de espera de reintento, el temporizador falso parece romper DuplexPair internamente
  • No probé las conexiones sin cifrar. Estos podrían verse afectados por los cambios en el flujo lógico (las señales no parecían propagarse correctamente a través de las tuberías, por lo que hay un controlador manual close en el zócalo)'

¡ Muchas gracias a

@joux3, ¿su bifurcación está lista para usar con Node 8, la versión actual de LTS? y ¿es posible abrir una solicitud de extracción? Me gustaría ver si resuelve un problema que tengo al usarlo junto con https://github.com/patriksimek/node-mssql/ ¡ gracias!

Tuve que eliminar la falsificación del temporizador de la prueba de tiempo de espera de reintento, el temporizador falso parece romper DuplexPair internamente

@joux3 ¿Qué prueba sería esa? (Lo siento, no estoy particularmente familiarizado con esta base de código más allá de lo que he visto para este problema)

@addaleax , la prueba fallida es https://github.com/tediousjs/tedious/blob/f5a0f95a5a522ad6a312170201b829e70c866976/test/integration/connection-retry-test.js#L73 -L104
Deshabilitar el temporizador aquí: https://github.com/tediousjs/tedious/pull/689/files#diff -ed1dc3ba8a10a8fb4b18a528b35bad00.
Editar: restauré la falsificación del temporizador solo falsificando setTimeout https://github.com/tediousjs/tedious/pull/689/commits/ff5d5eb1a3603db05266306a823fa49a98b50209.

@jimmont , abrí una solicitud de extracción en https://github.com/tediousjs/tedious/pull/689 (parece que hacer referencia a la identificación del problema en el nombre de relaciones públicas no es suficiente...). Las pruebas de integración pasan en el nodo 8, pero aún queda trabajo por hacer.

👍 ¡Para arreglar esto lo antes posible!

¿Algún progreso en este? Sería bueno si podemos obtener una actualización sobre este problema.

Vinculando PR #689 para seguimiento.

En un mundo donde las advertencias se envían a stderr en lugar de stdout. <fail/>

¿cualquier actualización?

738 contiene una solución y se fusionará y publicará una vez que alguien del equipo de @tediousjs/microsoft-contributors lo revise.

Después de mucho tiempo de ida y vuelta, esto finalmente se solucionó (y correctamente) a través de https://github.com/tediousjs/tedious/pull/738. [email protected] ahora está disponible en npm. Actualmente está etiquetado como next y me aseguraré de que esté etiquetado como latest pronto.

¡Gracias a todos por su paciencia y ayuda para solucionar esto! 🙇

¿Fue útil esta página
0 / 5 - 0 calificaciones