【问题标题】:node http proxy SSL transparent节点 http 代理 SSL 透明
【发布时间】:2012-04-22 12:38:46
【问题描述】:

在我的设置中,我有 2 层透明代理。当客户端发出 SSL 请求时,我希望它遇到的第一个代理只需将流量转发到另一个代理,而不尝试与客户端握手。

设置看起来很有趣,但在我的情况下这是合理的 - 第二个代理仅偶尔(通过其他一些服务)将自己注册到第一个代理。它告诉第一个:“我对一些看起来像___ 的流量感兴趣”。在大多数情况下,第一个代理只是简单地完成工作。

httpProxy(在节点代理中)可以代理 SSL 请求吗?我必须使用 httpsProxy(然后与客户端握手)吗?

【问题讨论】:

  • 您是在使用 MITM 代理(它可以查看内部连接,前提是其客户端被配置为信任它)还是仅相当于普通 HTTPS 代理,只是透明的?

标签: node.js ssl https proxy


【解决方案1】:

如果您愿意,您可以使用现有的 httpsProxy 完成所有这些操作。除非您想使用非节点代理或代理到不同的服务器,否则我看不出拥有两个代理会获得什么。

只需将所需的日志记录/签名逻辑添加到现有的 httpsProxy。

通常,我在代理上使用 https 来限制打开端口的数量并消除在所有运行的节点服务器上执行 https 的需要。您也可以使用 http-basic 库添加基本身份验证。

查看我的示例代码:https://github.com/TotallyInformation/node-proxy-https-example/blob/master/proxy.js

编辑 2012-05-15:嗯,经过一番思考,我想知道您是否不应该查看像 stunnel 这样的东西来做您想做的事情而不是 Node?​​p>

【讨论】:

  • 对不起,我已经澄清了我的问题。我想你可能理解错了。我意识到我现有的 httpsProxy 可以做我之前提到的 - 但这不是重点。
  • 在您的示例中,是客户端和代理之间通过 HTTPS 的连接(然后也可能是与目标服务器的连接),不是吗?我可以看到这一点,但这在透明代理上下文中没有意义。
  • 我不相信你可以使用 Node Proxy 来做到这一点,因为你实际上是在设置一个服务器来监听特定的代理。服务器要么必须侦听 http 或 https。如果是后者,那么它将进行握手。如果是前者,它将无法理解浏览器发送的 https。
【解决方案2】:

(作为参考,我已经在my answer to your similar question on ServerFault中提出了一些观点。)

  • 如果您使用 MITM 代理(即,可以使用自己的证书查看 SSL 内容的代理,只要客户端配置为信任它们就可以工作),它几乎不会完全透明,因为您至少必须将其客户端配置为信任其证书。

    此外,除非您的所有客户端都使用服务器名称指示扩展,否则代理本身将无法可靠地确定为哪个主机颁发其证书(这是普通 HTTPS 代理通过查看CONNECT客户端发出的请求)。

  • 如果您不是使用 MITM 代理,那么您不妨让初始连接通过您的路由器。如果您想记录该流量,您的路由器或许能够记录加密数据包。

    让您的路由器捕获 SSL/TLS 数据包以将它们透明地发送到代理,该代理最终只会将未触及的流量中继到目标服务器并没有多大意义。 (本质上,透明代理将暗示客户端未配置为了解它,因此它甚至不会发送您可以拥有请求的主机和端口的 CONNECT 方法。在这里,您真的会没有什么比路由器能做的多。)

    编辑:再一次,您只是将无法使用 HTTP 代理透明地分析连接的内容。即使使用普通代理,HTTPS 连接也会直接中继到目标服务器。 SSL/TLS 连接本身是在原始客户端和目标服务器之间建立的。使用 SSL/TLS 的目的是保护此连接,并让客户端注意到是否有东西试图查看连接内部。

    普通的 HTTP 透明代理服务器可以工作,因为 (a) 可以看到流量(特别是请求行和 HTTP Host 标头是可见的,因此代理可以知道自己发出哪个请求)和 (b)流量可以透明地更改,这样初始客户端就不会注意到请求不是直接的,并且可以正常工作。

    这些条件都不适用于 HTTPS。通过 HTTP 代理的 HTTPS 连接只是简单的隧道,在来自客户端的显式请求之后,客户端发送了一个 CONNECT 命令并被配置为使用这样的代理。

    要做一些接近您所追求的事情,您需要一个接受 SSL/TLS 连接并在您的 HTTP 代理之前对其进行解密(可能类似于 STunnel)的 SSL/TLS 服务器。但是,这不会是透明的,因为它无法生成正确的证书。

【讨论】:

  • 谢谢 - 在这种情况下,我不是在寻求 MITM。然而,第二个代理在转发时将用作 MITM。否则,是的,我只会通过路由器中继它。您提到的是我想要实现的目标,但是我似乎无法使用 node-proxy 来实现。
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 2013-07-07
  • 2011-06-11
  • 2023-03-15
相关资源
最近更新 更多