ExpressJS节点HTTPS服务器上的Heroku错误H13

时间:2012-07-14 17:31:46

标签: node.js ssl heroku https express

我正在尝试在我的Node.js服务器(Expressjs框架)上实现HTTPS。我有我签名的证书和密钥,以及用于测试/开发的自签名证书/密钥:

if(process.env.NODE_ENV == 'production'){
  var app = module.exports = express.createServer({
    key: fs.readFileSync('./ssl/nopass_server.key'),
    cert: fs.readFileSync('./ssl/server.crt')
  });
} else {
  var app = module.exports = express.createServer({
    key: fs.readFileSync('./ssl/self_signed/nopass_server.key'),
    cert: fs.readFileSync('./ssl/self_signed/server.crt')
  });
}

我还在Heroku上设置了SSL端点。在localhost上一切正常,Endpoint似乎工作正常,但是当我在生产中运行应用程序时(在Heroku上),我得到了一个H13应用程序错误。有趣的是(或者不是)如果我告诉express创建一个HTTP服务器:var app = module.exports = express.createServer()它可以工作,但Chrome会抱怨the page at https://mydomain.com ran insecure content from http://mydomain.com

我不能/不应该在快递中为生产创建HTTPS服务器吗?如果我应该,是否需要一些额外的东西让它在Heroku上工作(例如,我相信它用var port = process.env.PORT设置正确的端口)?如果没有,如果没有运行https服务器,我怎么能提供“安全”内容,以便浏览器不会抱怨?

我正在使用以下内容来处理任何非https请求:

app.get('*',function(req,res,next){
  if(req.headers['x-forwarded-proto'] != 'https'){
    res.redirect('https://mydomain.com'+req.url);
  } else next();
});

目前它位于我的其他路线上方,这可能是问题吗?这应该在其他地方吗?

我对https的使用经验非常有限,所以我可能会遗漏一些明显的东西。

2 个答案:

答案 0 :(得分:6)

在Heroku的负载均衡器上发生SSL终止;他们发送您的应用简单(非SSL)流量,因此您的应用应该创建一个非HTTPS服务器。至于the page at https://mydomain.com ran insecure content from http://mydomain.com,请确保所有图像/脚本/等。您的网页正在使用,也是通过https协议提供的。

答案 1 :(得分:0)

您可以使用app.enable('trust proxy'),然后req.secure也适用于Heroku。