在可以处理多个安全域的NodeJS中创build一个反向代理

我正在尝试在NodeJS中创build一个反向代理。 但我一直在运行的问题是,即使我想为多个域服务,我也只能在同一个端口(443)上提供一套authentication/密钥对。 我已经做了研究,并继续跑到同一个路段:

  • 可以服务多个域的节点脚本从非安全的本地源(http本地访问和服务https公共)
  • 让我dynamic服务器SSL证书通过域标头
  • 例:
    • https://www.someplace.com:443将从http:// thisipaddress:8000中获取并使用www.someplace.com的证书和密钥文件
    • https://www.anotherplace.com:443将从http:// thisipaddress:8080中提取,并使用www.anotherplace.com的证书和密钥文件
    • 等。
  • 我看过使用NodeJShttps.createServer(options,[requestListener])
    • 但是这个方法每个端口只支持一个证书/密钥对
    • 我找不到根据域标头dynamic切换证书的方法
    • 我不能要求我的人使用自定义的https端口
    • 如果我为多个域名提供相同的SSL证书,即使它是安全的,我也会碰到浏览SSL证书错误
  • 我看着node-http-proxy,但据我所见,它有相同的限制
  • 我查看了Apache的mod-proxy和nginx,但我宁愿有一些我可以直接控制的东西

如果任何人都可以向我展示一个使用NodeJShttps.createServernode-http-proxy从同一端口号(443)提供多个安全域的示例,那么我将对此感激不尽。

让我dynamic服务器SSL证书通过域标头

没有域头,所以我猜你是指HTTP请求中的主机头。 但是,这是不行的,因为

  • HTTPS是SSL内部封装的HTTP
  • 因此,您首先必须执行SSL层(例如需要证书的SSL握手),然后是HTTP层
  • 但主机头是在HTTP层:(

在以前,您需要为每个SSL证书使用一个IP地址。 当前的浏览器确实支持SNI(服务器名称指示),它发送已经在SSL层内的预期的目标主机。 它看起来像node.js确实支持这一点,寻找SNICallback 。 但是,要注意的是,还有足够多的库,或者根本不支持客户端的SNI,或者需要明确地使用它。 但是,只要你只想支持浏览器,这应该是好的。

有弹性是一个很好的图书馆来做到这一点,并有你所需要的一个例子 。

正如Steffen Ullrich所说,它将取决于浏览器对它的支持

以下是您可能正在查看的解决scheme,我发现它对于我的实现非常有用,但您需要进行大量的自定义来处理域

node-http-rev代理: https : //github.com/nodejitsu/node-http-proxy

Redbird实际上做得非常优雅,而且configuration也不难。

https://github.com/OptimalBits/redbird

如何在不同的端口上创buildSSL服务器,并在443上使用node-http-proxy作为服务器来中继基于域的请求。

你说你不想使用nginx,我不明白为什么。 你可以为你的nginx设置多个位置。 让他们每个人都听取不同的主机名,并在端口443上。给他们所有的代理通过你的nodejs服务器。 根据我的理解,这符合您的所有要求,并且是最先进的。