参考: 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 。
@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-mssql
和tedious
驱动程序( 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 讨论这些问题?):
Assertion failed: (uv__stream_fd(stream) >= 0), function uv_read_start, file ../deps/uv/src/unix/stream.c, line 1517.
上完全崩溃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/>
任何更新?
经过很长一段时间的来回,这终于(并且正确地)通过https://github.com/tediousjs/tedious/pull/738修复了[email protected]
现在可以在 npm 上使用。 它目前被标记为next
,我会确保它很快就会被标记为latest
。
感谢大家的耐心和帮助,以解决此问题! 🙇
最有用的评论
738 包含一个修复程序,一旦由@tediousjs/microsoft-contributors 团队的人员审核,将被合并并发布。