node.js - 从 Node.js 中的 https.Server#clientError 获取 remoteAddress

标签 node.js sockets ssl https

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

securePair作为 tls.SecurePair 的实例, securePair.cleartext一个tls.CleartextStreamsecurePair.encrypted一个tls.CryptoStream .

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

实际上,当我尝试使用 HTTP(假装它是 HTTP 服务器)连接到 HTTPS 服务器并在几秒钟后取消时,我得到一个 clientError类型 ECONNRESET ,但是socket.remoteAddresssocket.remotePort都是undefined (即使 securePair.cleartext.socket 确实是 net.Socket 而不是 undefined )。

最佳答案

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

显然,已经进行了修复(但尚未在任何已发布的 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,如果他们认为这值得修复)并希望它得到真正的修复。

关于node.js - 从 Node.js 中的 https.Server#clientError 获取 remoteAddress,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25257709/

相关文章:

python - 使用 SOCK_STREAM 代理处理 https 请求

Node.js - 连接版本不兼容

javascript - 使用 mongodb 聚合如何减去持续时间

javascript - Node.js 中的 Mysql 架构?

android - android sdk 级别 23 中 SSLParameter.setServerNames 的替代方法是什么

php - 如何通过 nginx/php 执行 bash 脚本

Apache X509 证书授权模式设置 HTTP header

Node.js:将标准输出捕获到字符串变量中的最简单方法

c - struct sockadr_in 不应该同时适用于 IPv4 和 IPv6 吗?

PHP UDP socket_recv() 超时