【问题标题】:Get remoteAddress from https.Server#clientError in Node.js从 Node.js 中的 https.Server#clientError 获取 remoteAddress
【发布时间】:2014-10-05 03:12:04
【问题描述】:

在 Node.js 中,http.Serverhttps.Server 都会发出 clientError 事件,但参数不同:
http.Server#clientError(exception, socket)
https.Server#clientError(exception, securePair)

securePairtls.SecurePairsecurePair.cleartext 一个 tls.CleartextStreamsecurePair.encrypted 一个 tls.CryptoStream 的一个实例。

问题是:如何获取导致clientError的客户端的地址和端口?理论上,这应该可行:
socket = securePair.cleartext.socket;
console.log(socket.remoteAddress + ':' + socket.remotePort);

实际上,当我尝试使用 HTTP 连接到 HTTPS 服务器(假装它是 HTTP 服务器)并在几秒钟后取消时,我得到了 ECONNRESET 类型的 clientError,但 socket.remoteAddress 和 @ 987654338@ 都是undefined(尽管securePair.cleartext.socket 确实是net.Socket 而不是undefined)。

【问题讨论】:

  • 这可能是因为 ssl 握手从未完成。如果您真的确实使用 https 连接然后发生错误会发生什么?
  • 按照设计,tls.SecurePair.cleartext 对应于预身份验证流,不应受到 SSL 握手失败的影响。无论如何,我认为只要建立 TCP 连接,期望https.Server 提供一种获取客户端地址的方法是完全合理的。
  • 我面临着完全相同的问题...

标签: node.js sockets ssl https


【解决方案1】:

不幸的是,赏金似乎没有多大帮助:-(我不得不自己调查这个。

显然,已经进行了修复(但尚未在任何发布的 node.js 中)即使在套接字关闭后也能够获取这些值:https://github.com/joyent/node/commit/8c38b07252d86f4eef91344f8df4f0c3e38bca35

一种解决方法是在连接时存储地址:

srv.on('connect', function (socket) {
  socket.stored_remoteAddress = socket.remoteAddress;
});
srv.on('clientError', function (err, socket) {
  console.log(socket.cleartext.socket.stored_remoteAddress);
}

这可行,但并不漂亮。


显然,即使这样也不能完全工作:-(

Node.js 0.11 不会在 SSL 错误时发出 'clientError' 事件(例如),因此无法捕捉那里的情况。

Node.js 0.12 发出 'clientError' 事件,但使用了一个新的 TLS 实现,它不再有 'cleartext' 套接字可用。我找不到任何方法将信息从 'connect' 事件传递给 'clientError' 事件,或者任何方法来找出它们是用于同一个套接字的(因为套接字已经在 'clientError' 事件中关闭)。

因此,似乎唯一的方法是等待一个新的 Node.js 版本(最早是 0.12.2,如果他们认为这值得修复)并希望这个问题得到真正的修复。

【讨论】:

  • 感谢您让我走上了正确的道路。我最终使用您指向的提交对 net.Socket 进行了猴子修补,然后使用 tlsSocket._parent._peername 从 tls 套接字对象访问远程套接字属性。非常感谢!
猜你喜欢
  • 2011-11-24
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 2016-12-02
  • 2020-12-31
  • 2018-11-09
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多