在可以处理多个安全域的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的证书和密钥文件
- 等。
- 我看过使用NodeJS的https.createServer(options,[requestListener])
- 但是这个方法每个端口只支持一个证书/密钥对
- 我找不到根据域标头dynamic切换证书的方法
- 我不能要求我的人使用自定义的https端口
- 如果我为多个域名提供相同的SSL证书,即使它是安全的,我也会碰到浏览SSL证书错误
- 我看着node-http-proxy,但据我所见,它有相同的限制
- 我查看了Apache的mod-proxy和nginx,但我宁愿有一些我可以直接控制的东西
如果任何人都可以向我展示一个使用NodeJS和https.createServer或node-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也不难。
如何在不同的端口上创buildSSL服务器,并在443上使用node-http-proxy作为服务器来中继基于域的请求。
你说你不想使用nginx,我不明白为什么。 你可以为你的nginx设置多个位置。 让他们每个人都听取不同的主机名,并在端口443上。给他们所有的代理通过你的nodejs服务器。 根据我的理解,这符合您的所有要求,并且是最先进的。