2012-07-14 65 views
2

我想在我的Node.js服务器(Expressjs框架)上实现HTTPS。我有我的签名证书和密钥,以及用于测试/开发的自签名证书/密钥:ExpressJS节点HTTPS服务器上的Heroku错误H13

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应用程序错误。有趣(或不),如果我告诉快递创建一个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的使用经验非常有限,所以我可能错过了一些明显的东西。

回答

6

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

+0

非https是,谢谢!事实证明,即使我在我的服务器上托管代码,jquery-ui css中的某些内容导致了警告。从https谷歌cdn中取出它,却摆脱了警告。 – hiattp 2012-07-15 18:57:11

+0

在这里简洁地回答:http://stackoverflow.com/a/23894573/1882064 – arcseldon 2014-10-09 15:30:39

0

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