我正在尝试在我的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的使用经验非常有限,所以我可能会遗漏一些明显的东西。
答案 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。