如何配置expressjs来处理http和https?

时间:2011-10-26 18:22:36

标签: node.js express

我已经搜索了stackoverflow和明确的谷歌小组,但我仍然很短暂。

从我收集的内容来看,我可以做以下两件事之一:

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时,我明白了:

(节点SSL)错误:1408A0C1:SSL例程:SSL3_GET_CLIENT_HELLO:无共享密码

当然,我可以默认选项1,但我真的,真的想知道为什么我在做选项2时得到“没有共享密码错误”。选项2将是我的首选路径。< / p>

2 个答案:

答案 0 :(得分:9)

根据@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的情况下运行节点,因此需要确保端口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 :(得分:-1)

您的证书是RSA证书而不是DSA证书吗?听起来像您的浏览器支持的密码不受nodejs服务器的支持 - 您需要更新OpenSSL并重新编译NodeJS吗?