节点http代理SSL透明

时间:2012-04-10 07:53:36

标签: node.js ssl https proxy

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

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

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

2 个答案:

答案 0 :(得分:5)

如果您愿意,可以使用现有的httpsProxy完成所有这些操作。除非您想要将非节点代理或代理用于其他服务器,否则我无法通过拥有两个来获得您将获得的收益。

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

通常,我在代理上使用https来限制开放端口的数量,并且不需要在运行的所有Node服务器上执行https。您也可以使用http-basic库添加Basic Auth。

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

编辑2012-05-15:嗯,经过一番思考后,我想知道你是不是应该像stunnel这样的东西来做你想要的而不是Node?

答案 1 :(得分: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连接的SSL / TLS服务器,并在你的HTTP代理之前解密它(可能就像STunnel一样)。但是,这不会是透明的,因为它无法生成正确的证书。