2012-07-14 52 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上使用。