Tedious: tls.createSecurePair está sendo preterido em tempo de execução

Criado em 26 fev. 2017  ·  33Comentários  ·  Fonte: tediousjs/tedious

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

Usado em:

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

Veja também #135.
Veja por exemplo https://github.com/sidorares/node-mysql2/pull/367 para um exemplo de detecção de recursos.

Comentários muito úteis

738 contém uma correção e será mesclado e lançado assim que for revisado por alguém da equipe @tediousjs/microsoft-contributors.

Todos 33 comentários

@ChALkeR Obrigado pelo ponteiro. Isso será útil quando chegarmos a isso. Sinta-se à vontade para enviar um PR se você se sentir inspirado :-)

@tvrprasad : @ChALkeR faz parte da equipe Node.js e esta postagem é principalmente um tedious . 😄

@ChALkeR : Conheço essa depreciação há algum tempo, mas a documentação sobre essa depreciação é realmente escassa. Os exemplos que vi até agora (como o PR para node-mysql ) focam em atualizações TLS "simples", onde a conexão é apenas alternada de não-TLS para TLS.

No TDS, a atualização do TLS é muito mais envolvida, todos os pacotes de handshake precisam ser agrupados em mensagens TDS e, uma vez que a conexão é estabelecida, todos os outros pacotes TLS não precisam mais ser agrupados. Implementar isso via tls.createSecurePair foi bastante simples, mas a última vez que tentei isso via TLSSocket , não consegui fazê-lo funcionar. 😞

Vou tentar novamente quando chegar, mas acho que não mudou muita coisa.

Outro problema que encontrei é que envolver um soquete do pacote readable-stream em um TLSSocket causaria uma falha de segmentação (!) do processo Node.js. Infelizmente, não tenho etapas de reprodução à mão no momento. 😞

@arthurschreiber Obrigado pela informação :-)

mas a última vez que tentei isso via TLSSocket, não consegui fazê-lo funcionar.

Se este trabalho estiver no github, por favor me envie um ponteiro. Estou curioso para conferir.

@tvrprasad @arthurschreiber Aqui estão informações sobre como substituir tls.createSecurePair https://nodejs.org/dist/latest-v6.x/docs/api/tls.html#tls_class_securepair

Encontrou o mesmo problema no Node v8.0.1. Meu aplicativo relata o seguinte erro, depois de tentar estabelecer uma conexão criptografada:

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

Estou usando patriksimek/node-mssql e o driver tedious (o driver padrão de node-mssql ) para acessar nosso banco de dados Microsoft SQL Server.

Mesmo problema que @olange usando node-mssql com driver tedioso.

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

Por favor, não me leve a mal e eu realmente aprecio seus esforços para manter este módulo, mas há alguma previsão de quando ele será corrigido?

Usando o pacote 'mssql' e usando as opções:
{
criptografar: verdadeiro
}

(nó:13508) [DEP0064] DeprecationWarning: tls.createSecurePair() está obsoleto. Por favor, use tls.Socket em vez disso.

Quando a equipe do Node descontinua algo assim, qual é o prazo para remoção no Node? Apenas curioso.

Provavelmente será removido no Nó 9 ou 10. O recurso está obsoleto há pelo menos 4 anos. :-/ Este é um dos únicos pacotes NPM populares que ainda o utilizam.

Alguém dos colaboradores tem algum cronograma de quando a mudança será lançada?

Obtendo isso hoje desde que acabei de atualizar nossos sistemas para o nó 8.9.0 lts. Eu tenho dois projetos pesados ​​agora, mas se ambos facilitarem, vou ver se consigo arranjar algum tempo para consertar isso.

@Iiridayn Isso seria incrível!
Eu dei uma olhada, mas não consegui descobrir como obter o pacote de handshake do TLSSocket, preso no mesmo ponto que https://github.com/tediousjs/tedious/issues/515#issuecomment -283191248 :confused:
Gostaria de saber se você tem ideias sobre isso.

Algum progresso nisso? Estou enfrentando o mesmo problema ao tentar me conectar ao Azure, apenas se isso ajudar.
Eu ficaria grato se alguém me explicasse rapidamente qual é a consequência de executar um aplicativo enquanto ele está obsoleto, as consultas SQL que solicito não são executadas e preciso saber se essa é a causa, mas os textos sobre isso eu ' que li não são muito eloquentes.

Agradeço antecipadamente.

@Jorgeee1 Este é apenas um aviso, é improvável que seja o motivo do seu problema. Estou usando tedioso para me conectar ao Azure DB também e está funcionando bem.

Eu escrevi uma rápida prova de conceito da substituição de createSecurePair por TLSSocket + um servidor TCP para obter os dados brutos de handshake. Você pode dar uma olhada aqui . Os testes de integração que pude executar passaram.

Obviamente, isso não é uma solução real para o problema em questão (a menos que comer soquetes extras, etc., seja OK). Este é mais um iniciador de discussão. Seria bom ter sugestões e discussões reais em https://github.com/nodejs/help/issues/1010.

@joux3 isso é incrível 😃 Você pode criar um PR? Será mais fácil rever e discutir lá.

Projetos pesados ​​não diminuíram, um terceiro foi adicionado e também migramos para o MySQL. Desculpe, eu não serei capaz de corrigir este - boa sorte para você :).

Por favor, corrija, é um problema importante

Olá a todos,

deixe-me dar uma atualização rápida sobre o status atual aqui. Entendo que a mensagem de descontinuação pode ser um incômodo, mas não é realmente um problema. tls.createSecurePair pode estar obsoleto, mas para o futuro de curto e médio prazo, não vai a lugar nenhum. De acordo com https://github.com/nodejs/node/pull/17882 , ele não será removido em breve.

Além disso, https://github.com/nodejs/node/pull/17882 propõe uma reimplementação de tls.createSecurePair em termos de API pública node.js, introduzindo (por enquanto) um DuplexSocket interno tls.createSecurePair , sem recorrer a hacks interessantes 😁 mas não realmente viáveis ​​como proposto por @joux3. Provavelmente teremos que criar nossa própria versão DuplexSocket por enquanto, mas pelo menos agora tenho uma boa ideia de como resolver isso de forma tediosa, uma vez que fica claro quando tls.createSecurePair será realmente removido .

Por favor deixe nos saber o que você pensa! 😄

@arthurschreiber Fwiw, também acabei de publicar essa implementação DuplexPair em https://www.npmjs.com/package/duplexpair. Eu acho que você poderia construir um wrapper em torno disso para ter um sósia tls.createSecurePair() muito facilmente?

@addaleax Doce! ❤️ Isso é ótimo e vou ver se consigo conectar isso e nos afastar de tls.createSecurePair mais cedo ou mais tarde! Muito obrigado! 🙇

@arthurschreiber Acho que um patch para isso pode parecer tão simples quanto isso:

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

Mas isso não parece ser testado como parte do conjunto de testes regular, então não tenho certeza de como fazer isso…

Eu dei mais uma chance de substituir o SecurePair. Os testes de integração parecem estar bem, testados no Node 9. https://github.com/joux3/tedious/commit/6d255fbdaa2f9afd388617e6e34815cae95292a0

No entanto, tenho algumas observações (mas talvez o patch seja bom o suficiente para um PR discutir os problemas?):

  • Node.js 6 parece travar totalmente em Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1517.
  • Eu tive que remover a falsificação do temporizador do teste de tempo limite de repetição, o temporizador falso parece quebrar o DuplexPair internamente
  • Eu não testei conexões não criptografadas. Esses podem ser afetados pelas alterações do fluxo lógico (os sinais não parecem se propagar corretamente através dos tubos, portanto, há um manipulador close manual no soquete)'

Muito obrigado a

@joux3 seu fork está pronto para uso com o Node 8 - a versão atual do LTS? e é possível abrir um pull request? Gostaria de ver se resolve um problema que tenho usando em conjunto com https://github.com/patriksimek/node-mssql/ obrigado!

Eu tive que remover a falsificação do temporizador do teste de tempo limite de repetição, o temporizador falso parece quebrar o DuplexPair internamente

@joux3 Que teste seria esse? (Desculpe, não estou particularmente familiarizado com essa base de código além do que analisei para esse problema)

@addaleax , o teste com falha é https://github.com/tediousjs/tedious/blob/f5a0f95a5a522ad6a312170201b829e70c866976/test/integration/connection-retry-test.js#L73 -L104
A desativação do temporizador está aqui: https://github.com/tediousjs/tedious/pull/689/files#diff -ed1dc3ba8a10a8fb4b18a528b35bad00.
Edit: Eu restaurei a falsificação do temporizador apenas fingindo setTimeout https://github.com/tediousjs/tedious/pull/689/commits/ff5d5eb1a3603db05266306a823fa49a98b50209.

@jimmont , abri uma solicitação de pull em https://github.com/tediousjs/tedious/pull/689 (parece que referenciar o ID do problema no nome do PR não é suficiente ...). Os testes de integração são aprovados no Node 8, mas ainda há trabalho a fazer.

👍 Para corrigir isso o mais rápido possível!

Algum progresso neste? Será bom se pudermos obter uma atualização sobre esse problema.

Vinculando PR #689 para rastreamento.

Em um mundo onde os avisos são enviados para stderr em vez de stdout. <fail/>

Qualquer atualização?

738 contém uma correção e será mesclado e lançado assim que for revisado por alguém da equipe @tediousjs/microsoft-contributors.

Depois de muito tempo de idas e vindas, isso foi finalmente (e corretamente) corrigido via https://github.com/tediousjs/tedious/pull/738. [email protected] já está disponível no npm. No momento, está marcado como next e vou me certificar de que será marcado como latest breve.

Obrigado a todos pela paciência e ajuda para corrigir isso! 🙇

Esta página foi útil?
0 / 5 - 0 avaliações