【问题标题】:Node 4.1.0 TLSSocket issues节点 4.1.0 TLSSocket 问题
【发布时间】:2015-09-22 03:36:58
【问题描述】:

使用 TLSSocket 和 tls.connect 在 Node 中的奇怪行为。

var port = 7000;
var host = '94.125.182.252'; //freenode
var tls = require('tls');
var net = require('net');

var socket = new net.Socket();
var secure;

secure = new tls.TLSSocket( socket,  {
  isServer: false,
  rejectUnauthorized: false
});

// edit (left out of original post, but present in my test code, whoops)
secure.connect( {
  port: port,
  host: host
});

secure.setEncoding( 'utf8' );

secure.on( 'connect' , function() {
  console.log( 'connected' );
})

.on( 'secureConnect', function() {
  console.log( 'secure connect' );
})

.on( 'error', function( e ) {
  console.log( 'error', e );
})

.on( 'data', function( data ) {
  console.log( data );
});

if ( secure.isPaused() ) {
  console.log( 'socket was paused' );
  secure.resume();
}

这甚至不会尝试连接,也不会产生错误消息。我有wireshark监控,没有捕获任何活动。

另一种方法:

secure = tls.connect( {
  rejectUnauthorized: false,
  host: host,
  port: port,
  socket: socket
});

同样的故事,没有捕捉到,没有错误。如果我删除上面的socket: socket 方面,它将连接。这是有道理的,因为文档声明如果指定了套接字选项,它将忽略端口和主机。以上适用于我以前的 Node 版本(0.12.7)。

如果我想使用现有的套接字,我必须在调用 tls.connect 之前告诉它连接。

socket.connect( {
  port: port,
  host: host
});

secure = tls.connect( {
  rejectUnauthorized: false,
  socket: socket
});

这似乎不太合适。 将连接套接字传递给 tls.TLSSocket(socket, ...) 似乎没有效果。 'connect' 事件被触发,但我想这与 TLSSocket 无关。 我无法让 tls.TLSSocket(...) 处理以前的节点迭代。 单步调试节点并没有暴露任何明显的问题。

在您尝试连接之前,net.Socket([options]) 的选项似乎不接受用于配置的端口或主机,并且在传递给 tls.connect 之前尝试连接似乎违反直觉。这表明这不是预期的用途。

所以我的问题是:

我在 tls.TLSSocket() 上做错了什么,或者它可能是一个错误?

我是否正确假设将现有套接字传递给 tls.connect() 是为了已经建立的连接交换协议?如果没有,分配端口和主机的正确方法是什么?

编辑:

根据建议:

secure = tls.connect( {
  rejectUnauthorized: false,
  socket: socket
});


socket.connect( {
  port: port, 
  host: host
});

这行得通。

secure = new tls.TLSSocket( socket , {
  isServer: false,
  rejectUnauthorized: false
});

socket.connect( {
  port: port,
  host: host
});

不幸的是,这不起作用。发出“连接”事件,绝不会发出“安全连接”,也不会发出任何其他事件或数据。

【问题讨论】:

    标签: node.js sockets


    【解决方案1】:

    在您的前两个(非工作)示例中,您只创建了一个套接字并没有开始实际连接它。在原始代码的末尾添加socket.connect();,它应该可以正常工作。

    tls.connect() 当传递一个普通的套接字时,实际上并没有在内部调用socket.connect();,它只是设置开始侦听套接字上的数据,以便正确解密传入的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2020-05-16
      • 2013-03-29
      • 2016-07-15
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多