Tedious: tls.createSecurePair sedang dihentikan waktu prosesnya

Dibuat pada 26 Feb 2017  ·  33Komentar  ·  Sumber: tediousjs/tedious

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

Digunakan dalam:

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

Lihat juga #135.
Lihat misalnya https://github.com/sidorares/node-mysql2/pull/367 untuk contoh deteksi fitur.

Komentar yang paling membantu

738 berisi perbaikan dan akan digabungkan dan dirilis setelah ditinjau oleh seseorang dari tim @tediousjs/microsoft-contributor.

Semua 33 komentar

@ChALkeR Terima kasih atas penunjuknya. Ini akan sangat membantu ketika kita sampai pada ini. Jangan ragu untuk mengirim PR jika Anda merasa terinspirasi :-)

@tvrprasad : @ChALkeR adalah bagian dari tim Node.js dan postingan ini sebagian besar ditujukan sebagai tedious . 😄.

@ChALkeR : Saya sudah tahu tentang penghentian ini untuk sementara waktu, tetapi dokumentasi seputar penghentian ini sangat jarang. Contoh yang saya lihat sejauh ini (seperti PR untuk node-mysql ) fokus pada peningkatan TLS "sederhana", di mana koneksi baru saja dialihkan dari non-TLS ke TLS.

Di TDS, peningkatan TLS jauh lebih terlibat, semua paket handshaking perlu dibungkus ke dalam pesan TDS, dan kemudian setelah koneksi dibuat, semua paket TLS selanjutnya tidak perlu dibungkus lagi. Menerapkan ini melalui tls.createSecurePair cukup mudah, tetapi terakhir kali saya mencoba ini melalui TLSSocket , saya tidak dapat membuatnya berfungsi. 😞.

Saya akan mencoba lagi ketika saya mendapatkannya, tetapi saya tidak berpikir banyak yang berubah.

Masalah lain yang saya temui adalah membungkus soket dari paket readable-stream menjadi TLSSocket akan menyebabkan segfault (!) dari proses Node.js. Sayangnya, saya tidak memiliki langkah-langkah reproduksi yang berguna sekarang. 😞.

@arthurschreiber Terima kasih atas infonya :-)

tetapi terakhir kali saya mencoba ini melalui TLSSocket, saya tidak dapat membuatnya berfungsi.

Jika pekerjaan ini ada di github, kirimkan saya pointer. Saya penasaran untuk memeriksanya.

@tvrprasad @arthurschreiber Berikut adalah informasi tentang cara mengganti tls.createSecurePair https://nodejs.org/dist/latest-v6.x/docs/api/tls.html#tls_class_securepair

Mengalami masalah yang sama pada Node v8.0.1. Aplikasi saya melaporkan kesalahan berikut, setelah mencoba membuat koneksi terenkripsi:

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

Saya menggunakan patriksimek/node-mssql dan driver tedious (driver default node-mssql ) untuk mengakses database Microsoft SQL Server kami.

Masalah yang sama dengan @olange menggunakan node-

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

Tolong jangan salah paham dan saya sangat menghargai upaya Anda untuk mempertahankan modul ini tetapi Apakah ada prediksi kapan itu akan diperbaiki?

Menggunakan paket 'mssql' dan menggunakan opsi:
{
mengenkripsi: benar
}

(node:13508) [DEP0064] DeprecationWarning: tls.createSecurePair() tidak digunakan lagi. Silakan gunakan tls.Socket sebagai gantinya.

Ketika tim Node mencela sesuatu seperti ini, apa kerangka waktu untuk penghapusan di Node? Hanya penasaran.

Mungkin akan dihapus di Node 9 atau 10. Fitur ini tidak digunakan lagi dalam dokumen setidaknya selama 4 tahun. :-/ Ini adalah satu-satunya paket NPM populer yang masih menggunakannya.

Apakah ada dari kolaborator yang memiliki timeline tentang kapan perubahan akan dirilis?

Mendapatkan ini hari ini karena saya baru saja memperbarui sistem kami ke node 8.9.0 lts. Saya punya dua proyek berat sekarang, tetapi jika keduanya mereda, saya akan melihat apakah saya dapat meluangkan waktu untuk memperbaikinya.

@Iiridayn Itu akan luar biasa!
Saya memang sudah melihatnya, tetapi tidak tahu cara mendapatkan paket jabat tangan dari TLSSocket, macet di titik yang sama dengan https://github.com/tediousjs/tedious/issues/515#issuecomment -283191248 :confused:
Akan senang mendengar jika Anda memiliki ide tentang itu.

Ada kemajuan dalam hal itu? Saya menghadapi masalah yang sama saat mencoba terhubung ke Azure, hanya jika itu membantu.
Saya akan berterima kasih jika seseorang menjelaskan dengan cepat kepada saya apa konsekuensi menjalankan aplikasi saat ini tidak digunakan lagi, kueri SQL yang saya minta tidak dieksekusi dan saya perlu tahu apakah ini penyebabnya, tetapi teks tentang ini saya' sudah membaca tidak terlalu fasih.

Terima kasih sebelumnya.

@Jorgeee1 Ini hanya peringatan, tidak mungkin menjadi alasan masalah Anda. Saya menggunakan membosankan untuk terhubung ke Azure DB juga, dan itu berfungsi dengan baik.

Saya menulis bukti cepat konsep penggantian createSecurePair dengan TLSSocket + server TCP untuk mendapatkan data jabat tangan mentah. Anda dapat melihatnya di sini . Tes integrasi yang dapat saya jalankan berhasil.

Ini jelas bukan solusi nyata untuk masalah yang dihadapi (kecuali makan soket ekstra dll tidak masalah). Ini lebih merupakan pembuka diskusi. Sebaiknya ada saran dan diskusi aktual di https://github.com/nodejs/help/issues/1010.

@joux3 luar biasa Bisakah kamu membuat PR? Akan lebih mudah untuk meninjau dan berdiskusi di sana.

Proyek berat belum mereda, sepertiga telah ditambahkan, dan kami juga telah bermigrasi ke MySQL. Maaf saya tidak akan dapat memperbaiki yang satu ini - semoga sukses untuk Anda :).

Tolong perbaiki, ini masalah penting

Hei kalian semua,

izinkan saya memberikan pembaruan cepat tentang status saat ini di sini. Saya mengerti bahwa pesan penghentian mungkin mengganggu, tapi itu tidak benar-benar masalah. tls.createSecurePair mungkin tidak digunakan lagi, tetapi untuk masa depan jangka pendek dan menengah, itu tidak akan kemana-mana. Menurut https://github.com/nodejs/node/pull/17882 , itu tidak akan segera dihapus.

Juga, https://github.com/nodejs/node/pull/17882 mengusulkan implementasi ulang tls.createSecurePair dalam hal API node.js publik, memperkenalkan internal (untuk saat ini) DuplexSocket kelas. Dasar-dasar implementasi ini adalah persis apa yang kita butuhkan agar membosankan untuk beralih dari tls.createSecurePair , tanpa menggunakan yang menarik 😁 tapi bukan peretasan yang benar-benar layak seperti yang diusulkan oleh @joux3. Kita mungkin harus membuat versi DuplexSocket kita sendiri untuk saat ini, tetapi setidaknya sekarang saya memiliki ide yang bagus tentang cara menyelesaikan ini dengan cara yang membosankan setelah jelas kapan tls.createSecurePair benar-benar akan dihapus .

Tolong beri tahu kami pendapat Anda! 😄.

@arthurschreiber Fwiw, saya juga baru saja menerbitkan implementasi DuplexPair di https://www.npmjs.com/package/duplexpair. Saya kira Anda dapat membuat pembungkus di sekitarnya untuk memiliki tls.createSecurePair() mirip dengan cukup mudah?

@addaleax Manis! ❤️ Ini bagus dan saya akan melihat apakah saya dapat menghubungkan ini dan membuat kita menjauh dari tls.createSecurePair lebih cepat daripada nanti! Terima kasih banyak! 🙇.

@arthurschreiber Saya pikir tambalan untuk ini bisa terlihat sesederhana ini:

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

Tapi ini sepertinya tidak diuji sebagai bagian dari rangkaian pengujian reguler, jadi saya tidak yakin bagaimana cara melakukannya…

Saya mencoba lagi untuk mengganti SecurePair. Tes integrasi tampaknya baik-baik saja, diuji pada Node 9. https://github.com/joux3/tedious/commit/6d255fbdaa2f9afd388617e6e34815cae95292a0

Namun saya memiliki beberapa pengamatan (tapi mungkin tambalan cukup baik untuk PR untuk membahas masalah?):

  • Node.js 6 tampaknya benar-benar macet pada Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1517.
  • Saya harus menghapus pemalsuan penghitung waktu dari uji batas waktu coba lagi, penghitung waktu palsu tampaknya merusak DuplexPair secara internal
  • Saya tidak menguji koneksi yang tidak terenkripsi. Itu mungkin dipengaruhi oleh perubahan aliran logika (sinyal tampaknya tidak menyebar dengan benar melalui pipa sehingga ada manual close handler pada soket)'

Terima kasih banyak kepada @addaleax atas pekerjaan Anda!

@joux3 apakah garpu Anda siap digunakan dengan Node 8--rilis LTS saat ini? dan apakah mungkin untuk membuka permintaan tarik? Saya ingin melihat apakah ini menyelesaikan masalah yang saya gunakan bersama dengan https://github.com/patriksimek/node-mssql/ terima kasih!

Saya harus menghapus pemalsuan penghitung waktu dari uji batas waktu coba lagi, penghitung waktu palsu tampaknya merusak DuplexPair secara internal

@joux3 Tes apa itu? (Maaf, saya tidak terlalu akrab dengan basis kode ini di luar apa yang saya lihat untuk masalah ini)

@addaleax , tes yang gagal adalah https://github.com/tediousjs/tedious/blob/f5a0f95a5a522ad6a312170201b829e70c866976/test/integration/connection-retry-test.js#L73 -L104
Menonaktifkan pengatur waktu di sini: https://github.com/tediousjs/tedious/pull/689/files#diff -ed1dc3ba8a10a8fb4b18a528b35bad00.
Sunting: Saya memulihkan pemalsuan waktu hanya dengan memalsukan setTimeout https://github.com/tediousjs/tedious/pull/689/commits/ff5d5eb1a3603db05266306a823fa49a98b50209.

@jimmont , saya membuka permintaan tarik di https://github.com/tediousjs/tedious/pull/689 (sepertinya referensi id masalah dalam nama PR tidak cukup ...). Tes integrasi melewati Node 8, tetapi masih ada beberapa pekerjaan yang harus dilakukan.

👍 Untuk memperbaiki ini secepatnya!

Ada kemajuan dalam hal ini? Akan lebih baik jika kita bisa mendapatkan pembaruan tentang masalah ini.

Menautkan PR #689 untuk pelacakan.

Di dunia di mana peringatan dikirim ke stderr, bukan stdout. <fail/>

perubahan apapun?

738 berisi perbaikan dan akan digabungkan dan dirilis setelah ditinjau oleh seseorang dari tim @tediousjs/microsoft-contributor.

Setelah lama bolak-balik, ini akhirnya (dan benar) diperbaiki melalui https://github.com/tediousjs/tedious/pull/738 . [email protected] sekarang tersedia di npm. Saat ini ditandai sebagai next dan saya akan memastikan itu akan segera ditandai sebagai latest .

Terima kasih semuanya atas kesabaran dan bantuan Anda dalam menyelesaikan masalah ini! 🙇.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat