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尝试这个时,我无法让它工作。 😞

当我得到它时,我会再试一次,但我认为没有太大变化。

我遇到的另一个问题是将readable-stream包中的套接字包装到TLSSocket会导致 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-mssqltedious驱动程序( node-mssql的默认驱动程序)来访问我们的 Microsoft SQL Server 数据库。

与使用带有繁琐驱动程序的 node-mssql 的@olange相同的问题。

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

请不要误会我的意思,我非常感谢您为保持此模块所做的努力,但是是否有任何预测何时修复?

使用包“mssql”并使用选项:
{
加密:真
}

(节点:13508)[DEP0064] DeprecationWarning:不推荐使用 tls.createSecurePair()。 请改用 tls.Socket。

当 Node 团队弃用这样的东西时,在 Node 中删除的时间框架是什么? 只是好奇。

可能会在 Node 9 或 10 中删除。该功能已被 doc-deprecated 至少 4 年。 :-/ 这是唯一仍在使用它的流行 NPM 包之一。

合作者中的任何人是否有任何关于何时发布更改的时间表?

今天得到这个,因为我刚刚将我们的系统更新到节点 8.9.0 lts。 我现在有两个繁重的项目,但如果他们都放松了,我会看看我是否可以抽出一些时间来解决这个问题。

@Iiridayn那太棒了!
我确实看过它,但无法弄清楚如何从 TLSSocket 获取握手数据包,与https://github.com/tediousjs/tedious/issues/515#issuecomment -283191248 卡在同一点:困惑:
如果您对此有任何想法,我很想听听。

这方面有什么进展吗? 我在尝试连接到 Azure 时遇到了同样的问题,只要它有帮助。
如果有人快速向我解释运行应用程序的后果是什么,而这已被弃用,我请求的 SQL 查询没有被执行,我需要知道这是否是原因,但是关于此的文本我将不胜感激我读的不是很雄辩。

先感谢您。

@Jorgeee1这只是一个警告,不太可能是您遇到麻烦的原因。 我也在使用乏味的方式连接到 Azure DB,并且运行良好。

我写了一个快速概念证明,用TLSSocket + TCP 服务器替换createSecurePair来获取原始握手数据。 你可以看看这里。 我可以运行的集成测试通过了。

这显然不是手头问题的真正解决方案(除非吃额外的套接字等是可以的)。 这更像是一个讨论的开始。 最好在https://github.com/nodejs/help/issues/1010上有实际的建议和讨论

@joux3太棒了😃 你能创建一个 PR 吗? 在那里审查和讨论会更容易。

繁重的项目并没有缓和下来,增加了第三个,我们也迁移到了 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,我还刚刚在https://www.npmjs.com/package/duplexpair 上发布了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。 集成测试似乎很好,在节点 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你的 fork 准备好与 Node 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 :
编辑:我只通过伪造setTimeout https://github.com/tediousjs/tedious/pull/689/commits/ff5d5eb1a3603db05266306a823fa49a98b50209 来恢复计时器伪造

@jimmont ,我在https://github.com/tediousjs/tedious/pull/689打开了一个拉取请求(看起来在 PR 名称中引用问题 ID 是不够的......)。 集成测试在 Node 8 上通过,但仍有一些工作要做。

👍 尽快解决这个问题!

这方面有什么进展吗? 如果我们能获得有关此问题的更新,那就太好了。

链接 PR #689 进行跟踪。

在将警告发送到标准错误而不是标准输出的世界中。 <fail/>

任何更新?

738 包含一个修复程序,一旦由@tediousjs/microsoft-contributors 团队的人员审核,将被合并并发布。

经过很长一段时间的来回,这终于(并且正确地)通过https://github.com/tediousjs/tedious/pull/738修复了[email protected]现在可以在 npm 上使用。 它目前被标记为next ,我会确保它很快就会被标记为latest

感谢大家的耐心和帮助,以解决此问题! 🙇

此页面是否有帮助?
0 / 5 - 0 等级