如何配置ExpressJS以处理HTTP和HTTPS?

8
我已经仔细查阅了stackoverflow和express谷歌小组,但是我仍然没有找到答案。
根据我的理解,我可以采取以下两种方法之一:
1) 创建一个HTTP服务器实例和一个HTTPS服务器实例,并将它们设置为监听两个不同的端口。在路由中,将HTTP请求重定向到HTTPS端口。
//app
var app = express.createServer();
var app_secure = express.createServer({key: key, cert: cert});

app.listen(8080);
app_secure.listen(8443);

//routes
app.get("unsecure/path", function(req, res) {
  ...
}

app.get("secure/path", function(req, res) {
  res.redirect("https://domain" + req.path);
}

app_secure.get("secure/path", function(req, res) {
  res.send("secure page");
}

2) 按照TJ Hollowaychuk的建议执行:https://gist.github.com/1051583

var http = require("http");
var https = require("https");
var app = express.createServer({key: key, cert: cert});

http.createServer(app.handle.bind(app)).listen(8080);
https.createServer(app.handle.bind(app)).listen(8443);

当我选择选项1时,一般不会出现问题。然而,管理两个服务器感觉很笨拙,我真的觉得应该有更好的方法。
当我选择选项2时,出现以下错误:
(node SSL) error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher 当然,我可以默认选择选项1,但我真的非常想知道为什么在选择选项2时出现了“没有共享密钥”的错误。而选项2是我更倾向于的路线。

我最终使用Nginx来处理SSL。@Benjie 证书是RSA。我会在不久的将来尝试您的建议。谢谢。 - ant
你能指出如何配置nginx处理node的ssl吗?谢谢。 - Mamsaac
问题在于你没有按照TJ的要求去做 - 差不多,但并不完全一样。https选项需要传递到https服务器,而不是express.createServer。然后它就可以工作了。然而,让它与websocket服务器一起工作是另一回事:) - youurayy
1
@Mamsaac 抱歉,我没能及时看到你的评论。我在这里记录了我所做的事情:http://fanqu.net/notes/。我对这方面还是有些新手,所以你可以从中得到一些启示。 - ant
我甚至都忘了这个。谢谢 :) 我做了一些不同的事情,因为我使用nginx进行负载均衡。 - Mamsaac
2个回答

11

根据@ypocat的评论,您可以通过以下方式在您的express.js应用程序中启用https:

 var http = require('http');
 var https = require('https');
 var express = require('express');
 var fs = require('fs');

 var app = express.createServer();

 // cutomize your app as ususal
 app.configure( function () { ... });
 app.configure('production', function () { ... });
 // ....

 // attach express handler function to TWO servers, one for http and one for https
 http.createServer(app.handle.bind(app)).listen(8080);
 https.createServer({
   ca: fs.readFileSync('./server.ca-bundle'),
   key: fs.readFileSync('./server.key'),
   cert: fs.readFileSync('./server.crt')
 }, app.handle.bind(app)).listen(8081);

请注意,您应该从证书颁发机构获得server.ca-bundle、server.key和server.crt。
此外,由于您可能会在没有sudo权限的情况下运行node,请确保端口80(http)和443(https)是开放的。
# in Ubuntu
sudo ufw status
sudo ufw allow 80
sudo ufw allow 443

并将8080端口的请求转发到80端口,将8081端口的请求转发到443端口。

# in Ubuntu
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8081

希望这可以帮助您。

-1

你的证书是RSA证书而不是DSA证书吗?听起来你的浏览器支持的加密方式不被你的NodeJS服务器支持 - 你可能需要更新你的OpenSSL并重新编译NodeJS?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接