如何configurationexpressjs来处理http和https?

我已经search了stackoverflow和快速谷歌组,但我仍然不足。

从我所收集到的,我可以做两件事之一:

1)创build一个http服务器和https服务器的实例,并设置两个侦听两个不同的端口。 在路由中,将http请求redirect到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时,通常没有问题。 但是,pipe理两台服务器感觉很笨拙,我真的觉得应该有一个更好的方法。

当我做2,我得到这个:

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

当然,我可以默认select1,但我真的很想知道为什么当我做选项2时,我得到了“没有共享的密码错误”。选项2是我的首选路线。

在@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 

希望这可以帮助

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