节点http代理SSL透明

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

设置似乎很有趣,但在我的情况下是合理的 – 第二个代理注册自己的第一个(通过一些其他服务)只偶尔。 它告诉第一个:“我感兴趣的是看起来像_ _ _的一些stream量”。 在大多数情况下,第一个代理人只是做这个工作。

一个httpProxy(在节点代理)代理SSL请求? 我必须使用一个httpsProxy(然后将与客户端握手)?

如果你愿意的话,你可以用现有的httpsProxy来完成所有的工作。 除非你想要使用非节点代理或代理服务器到另一台服务器,否则我不能看到你会得到两个。

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

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

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

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

(作为参考,我已经回答了有关ServerFault上类似问题的一些观点。)

  • 如果您使用的是MITM代理(也就是说,可以使用自己的证书查看SSL内容的代理,如果客户端configuration为信任它们,则代理可以工作),但是它不会完全透明,因为您将至less必须将其客户端configuration为信任其证书。

    另外,除非所有的客户端使用服务器名称指示扩展名,否则代理服务器本身将无法可靠地确定哪个主机为其颁发其证书(通过查看发出的CONNECT请求,正常的HTTPS代理已经能够知道的东西由客户)。

  • 如果您不是在MITM代理之后,那么您可以通过路由器通过初始连接。 如果你想logging这个stream量,你的路由器可能能够loggingencryption的数据包。

    让你的路由器抓住SSL / TLS数据包透明地发送给一个代理服务器,而这个代理服务器只会把这个数据stream转发到目标服务器上,这样做没有什么意义。 (从本质上讲,透明代理将意味着客户端没有configuration知道它,所以它甚至不会发送它的CONNECT方法,你可以拥有请求的主机和端口。在这里,你真的什么也没有比路由器能做的更多。)

    编辑:再一次,你只是能够使用HTTP代理透明地分析连接的内容。 即使使用普通代理,HTTPS连接也会直接传递到目标服务器。 原始客户端和目标服务器之间build立SSL / TLS连接本身。 使用SSL / TLS的目的是为了保护这个连接,并且如果有什么东西想要查看连接内部的话就让客户端注意到。

    纯HTTP透明代理服务器工作,因为(一)stream量可以看到(特别是,请求行和HTTP Host头是可见的,以便代理可以知道自己的请求)和(b)的stream量可以改变透明,以便最初的客户端不会注意到请求不是直接的,并且像以前一样工作。

    这些条件都不适用于HTTPS。 通过HTTP代理的HTTPS连接只是隧道,在客户端的明确请求之后,已经发送CONNECT命令并被configuration为使用这样的代理。

    为了做一些与之相近的事情,你需要一个接受SSL / TLS连接的SSL / TLS服务器,并在你的HTTP代理之前parsing它(可能类似于STunnel)。 但是,这不会是透明的,因为它将无法生成正确的证书。