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

时间:2014-04-06 02:47:49

标签: node.js ssl proxy reverse-proxy

我试图在NodeJS中创建反向代理。但是我一直在运行这个问题,因为我只能在同一个端口(443)上提供一组证书/密钥对,即使我想服务多个域。我已完成研究并继续遇到同样的路障:

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

如果有人可以向我展示使用NodeJS和 https.createServer node-http-从同一端口号(443)使用自己的证书提供多个安全域的示例代理我很感激你。

6 个答案:

答案 0 :(得分:3)

Redbird实际上非常优雅,也不太难配置。

https://github.com/OptimalBits/redbird

答案 1 :(得分:2)

  

让我通过域头

动态地为SSL证书服务

没有域头,所以我猜你的意思是HTTP请求中的Host头。 但是,这不起作用,因为

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

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

答案 2 :(得分:2)

Bouncy是一个很好的图书馆,可以提供an example

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

答案 3 :(得分:2)

以下是您可能正在考虑的解决方案, 我发现它对我的实现非常有用 虽然你需要做大量的自定义来处理域

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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