Tedious: tls.createSecurePairは実行時に非推奨になります

作成日 2017年02月26日  ·  33コメント  ·  ソース: tediousjs/tedious

参照: https

で使われる:

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 :この非推奨についてはしばらく前から知っていましたが、この非推奨に関するドキュメントは本当にまばらです。 これまでに見た例( node-mysqlのPRなど)は、接続が非TLSからTLSに切り替わる「単純な」TLSアップグレードに焦点を当てています。

TDSでは、TLSのアップグレードははるかに複雑であり、すべてのハンドシェイクパケットをTDSメッセージにラップする必要があります。接続が確立されると、それ以降のすべてのTLSパケットをラップする必要がなくなります。 tls.createSecurePairを介してこれを実装するのは非常に簡単TLSSocketを介してこれを試したとき、動作させることができませんでした。 😞

そこに着いたらもう一度やり直しますが、あまり変わっていないと思います。

私が遭遇したもう1つの問題は、 readable-streamパッケージのソケットをTLSSocketラップすると、Node.jsプロセスのセグメンテーション違反(!)が発生することです。 残念ながら、現在、複製手順は便利ではありません。 😞

@arthurschreiber情報をありがとう:-)

しかし、前回TLSSocketを介してこれを試したとき、動作させることができませんでした。

この作品がgithubにある場合は、ポインターを送ってください。 私はそれをチェックすることに興味があります。

ノードv8.0.1で同じ問題が発生しました。 暗号化された接続を確立しようとした後、私のアプリは次のエラーを報告します:

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

patriksimek/node-mssqltediousドライバー( node-mssqlのデフォルトドライバー)を使用して、Microsoft SQLServerデータベースにアクセスしています。

面倒なドライバでノード-MSSQLを使用して@olangeと同じ問題。

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

誤解しないでください。このモジュールを維持するための努力に心から感謝していますが、いつ修正されるかについての予測はありますか?

パッケージ「mssql」の使用とオプションの使用:
{{
暗号化:true
}

(ノード:13508)[DEP0064]非推奨警告:tls.createSecurePair()は非推奨になりました。 代わりにtls.Socketを使用してください。

ノードチームがこのようなものを非推奨にした場合、ノードでの削除の時間枠はどうなりますか? ちょっと興味があるんだけど。

おそらくノード9または10で削除されるでしょう。この機能は少なくとも4年間ドキュメントで非推奨になっています。 :-/これはまだそれを使用している唯一の人気のあるNPMパッケージの1つです。

共同作業者の誰かが、変更がいつリリースされるかについてのタイムラインを持っていますか?

システムをノード8.9.0ltsに更新したばかりなので、今日これを取得します。 現在、2つの重いプロジェクトがありますが、両方が楽になれば、これを修正するために時間を割けるかどうかを確認します。

@Iiridaynそれは素晴らしいでしょう!
私はそれを見ましたが、TLSSocketからハンドシェイクパケットを取得する方法を理解できませんでした。https: //github.com/tediousjs/tedious/issues/515#issuecomment -283191248:confused:と同じポイントでスタックしました。
あなたがそれについての考えを持っているかどうか聞いてみたいです。

その上で何か進歩はありますか? Azureに接続しようとしても、問題が解決する場合でも、同じ問題が発生します。
これが非推奨になっている間にアプリを実行した結果はどうなるのか、誰かがすぐに説明してくれたらありがたいです。私が要求するSQLクエリは実行されず、これが原因かどうかを知る必要がありますが、これに関するテキストは私です。読んだことはあまり雄弁ではありません。

前もって感謝します。

@ Jorgeee1これは単なる警告であり、問​​題の原因となる可能性は低いです。 私もAzureDBへの接続に面倒な作業を行っていますが、正常に機能しています。

createSecurePairTLSSocket + TCPサーバーに置き換えて、生のハンドシェイクデータを取得するという概念実証を作成しました。 ここでそれを見ることができます。 実行できる統合テストに合格しました。

これは明らかに目前の問題に対する実際の解決策ではありません(余分なソケットなどを食べても問題がない場合を除く)。 これは議論のきっかけになります。 https://github.com/nodejs/help/issues/1010で実際の提案やディスカッションを行うとよいでしょう

@ joux3それは素晴らしいです😃PRを作成できますか? そこでレビューして議論する方が簡単です。

重いプロジェクトは緩和されておらず、3分の1が追加されており、MySQLにも移行しています。 申し訳ありませんが、これを修正することはできません-幸運を祈ります:)。

それを修正してください、それは重要な問題です

やあ、みんな、

ここで現在の状況について簡単に更新します。 非推奨のメッセージが迷惑になる可能性があることは理解していますが、実際には問題ではありません。 tls.createSecurePairは廃止される可能性がありますが、短期および中期的にはどこにも行きません。 https://github.com/nodejs/node/pull/17882によると、すぐに削除されることはありません。

また、 https://github.com/nodejs/node/pull/17882は、パブリックnode.js APIに関してtls.createSecurePair再実装を提案し、(今のところ)内部DuplexSocket導入していますtls.createSecurePairから離れるために必要なものですが、@ joux3によって提案されたような実際には実行可能なハックではありません。 今のところ、おそらく独自のDuplexSocketバージョンを作成する必要がありますが、少なくとも、 tls.createSecurePairが実際にいつ削除されるかが明確になったら、これを面倒な方法で解決する方法については良い考えがあります。 。

ご意見をお聞かせください。 😄

@arthurschreiber Fwiw、私はそのDuplexPair実装をhttps://www.npmjs.com/package/duplexpairで公開しましたtls.createSecurePair()非常に簡単にそっくりにするために、その周りにラッパーを作成できると思いますか?

@addaleax Sweet! ❤️これは素晴らしいことです。これを接続して、後でではなく早く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の交換についてさらに別のショットを行いました。 統合テストは問題ないようで、ノード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は、ノード8で使用する準備ができています-現在のLTSリリースですか? プルリクエストを開く可能性はありますか? 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を偽造するだけでタイマー偽造を復元しました

@ jimmonthttps://github.com/tediousjs/tedious/pull/689でプルリクエストを開きました(PR名で課題IDを参照するだけでは不十分なようです...)。 統合テストはノード8に合格しますが、まだやるべきことがいくつかあります。

👍これをできるだけ早く修正するために!

これについて何か進展はありますか? この問題に関する最新情報を入手できれば幸いです。

追跡のためにPR#689をリンクします。

警告がstdoutではなくstderrに送信される世界。 <fail/>

すべてのアップデート?

738には修正が含まれており、@ tediousjs / microsoft-contributorsチームの誰かがレビューすると、マージされてリリースされます。

長い間行ったり来たりした後、これは最終的に(そして適切に) https://github.com/tediousjs/tedious/pull/738を介して修正されました[email protected]がnpmで利用できるようになりました。 現在nextタグが付けられており、まもなくlatestタグが付けられるようにします。

皆さんの忍耐とこれを修正するのを手伝ってくれてありがとう! 🙇

このページは役に立ちましたか?
0 / 5 - 0 評価