在我的设置中,我有 2 层透明代理。当客户端发出 SSL 请求时,我希望它遇到的第一个代理只需将流量转发到另一个代理,而不尝试与客户端握手。
设置看起来很有趣,但在我的情况下是合理的 - 第二个代理仅偶尔(通过其他一些服务)将自己注册到第一个代理。它告诉第一个:“我对一些看起来像_ _ _ 的流量感兴趣”。在大多数情况下,第一个代理只是简单地完成工作。
httpProxy(在节点代理中)可以代理 SSL 请求吗?我必须使用 httpsProxy(然后它将与客户端握手)吗?
如果您愿意,您可以使用现有的 httpsProxy 来完成所有这些操作。除非您想使用非节点代理或代理到不同的服务器,否则我看不出拥有两个代理会获得什么。
只需将所需的日志记录/签名逻辑添加到现有的 httpsProxy。
通常,我在代理上使用 https 来限制打开端口的数量并消除在所有运行的节点服务器上执行 https 的需要。您也可以使用 http-basic 库添加基本身份验证。
请参阅我的示例代码:https ://github.com/TotallyInformation/node-proxy-https-example/blob/master/proxy.js
编辑 2012-05-15:嗯,经过一番思考,我想知道你是否不应该看像stunnel这样的东西来做你想做的事情而不是 Node?
(作为参考,我在回答您关于 ServerFault 的类似问题时已经提出了其中的一些观点。)
如果您使用 MITM 代理(即,可以使用自己的证书查看 SSL 内容的代理,只要客户端配置为信任它们就可以工作),它几乎不会完全透明,因为您将在至少必须配置其客户端以信任其证书。
此外,除非您的所有客户端都使用服务器名称指示扩展,否则代理本身将无法可靠地确定为哪个主机颁发其证书(普通 HTTPS 代理通过查看CONNECT
由客户端)。
如果您不使用 MITM 代理,那么您不妨让初始连接通过您的路由器。如果您想记录该流量,您的路由器可能能够记录加密数据包。
让您的路由器捕获 SSL/TLS 数据包以将它们透明地发送到代理,该代理最终只会将未触及的流量中继到目标服务器并没有多大意义。(本质上,透明代理将暗示客户端未配置为知道它,因此它甚至不会发送CONNECT
您可以使用请求的主机和端口的方法。在这里,您真的没有更多比路由器所能做的。)
编辑:再一次,您根本无法使用 HTTP 代理透明地分析连接的内容。即使使用普通代理,HTTPS 连接也会直接中继到目标服务器。SSL/TLS 连接本身是在原始客户端和目标服务器之间建立的。使用 SSL/TLS 的目的是保护此连接,并让客户端注意到是否有东西试图查看连接内部。
普通 HTTP 透明代理服务器之所以起作用,是因为 (a) 可以看到流量(特别是,请求行和 HTTPHost
标头是可见的,因此代理可以知道自己发出哪个请求)和 (b) 可以透明地更改流量这样最初的客户就不会注意到请求不是直接的,并且就像它是一样的。
这些条件都不适用于 HTTPS。通过 HTTP 代理的 HTTPS 连接只是隧道,在来自客户端的显式请求之后,客户端已发送CONNECT
命令并配置为使用此类代理。
为了做一些接近你所追求的事情,你需要一个 SSL/TLS 服务器来接受 SSL/TLS 连接并在你的 HTTP 代理之前对其进行解密(可能类似于 STunnel)。但是,这不会是透明的,因为它无法生成正确的证书。