[Node.js] 在express.js上啟用HTTPS


Answers

我遇到了一個類似的問題,讓SSL在端口443以外的端口上工作。在我的情況下,我有一個捆綁證書以及一個證書和一個密鑰。 捆綁證書是一個包含多個證書的文件,節點要求您將這些證書分解為數組的單獨元素。

    var express = require('express');
    var https = require('https');
    var fs = require('fs');

    var options = {
      ca: [fs.readFileSync(PATH_TO_BUNDLE_CERT_1), fs.readFileSync(PATH_TO_BUNDLE_CERT_2)],
      cert: fs.readFileSync(PATH_TO_CERT),
      key: fs.readFileSync(PATH_TO_KEY)
    };

    app = express()

    app.get('/', function(req,res) {
        res.send('hello');
    });

    var server = https.createServer(options, app);

    server.listen(8001, function(){
        console.log("server running at https://IP_ADDRESS:8001/")
    });

在app.js中,您需要指定https並相應地創建服務器。 另外,請確保您嘗試使用的端口實際上允許入站流量。

Question

我試圖讓HTTPS在express.js上工作,但我無法弄清楚。

這是我的app.js代碼。

var express = require('express');
var fs = require('fs');

var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');

var credentials = {key: privateKey, cert: certificate};


var app = express.createServer(credentials);

app.get('/', function(req,res) {
    res.send('hello');
});

app.listen(8000);

當我運行它時,它似乎只響應HTTP請求。

我寫了簡單的基於vanilla node.js的HTTPS應用程序:

var   fs = require("fs"),
      http = require("https");

var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();

var credentials = {key: privateKey, cert: certificate};

var server = http.createServer(credentials,function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

server.listen(8000);

當我運行這個應用程序時,它確實響應了HTTPS請求。 請注意,我不認為fs結果上的toString()結果很重要,因為我已經使用了兩者的組合,但仍然沒有es bueno。

編輯添加:

對於生產系統,您最好使用Nginx或HAProxy將請求代理到您的nodejs應用程序。 您可以設置nginx來處理ssl請求,並只向您的節點app.js發送http。

編輯添加(4/6/2015)

對於使用AWS的系統,最好使用EC2彈性負載平衡器來處理SSL終止,並允許定期向您的EC2 Web服務器發送HTTP流量。 為了進一步提高安全性,請設置您的安全組,以便只允許ELB將HTTP流量發送到EC2實例,這將防止外部未加密的HTTP流量擊中您的計算機。




包括積分:

  1. SSL設置
    1. 在config / local.js中
    2. 在config / env / production.js中

HTTP和WS處理

  1. 該應用必須在開發中運行HTTP,以便我們可以輕鬆調試我們的應用。
  2. 出於安全考慮,該應用程序必須在生產環境中運行HTTPS。
  3. 應用生產HTTP請求應該總是重定向到https。

SSL配置

在Sailsjs中,有兩種​​方法來配置所有的東西,首先是在config文件夾中配置,每個文件都有它們的單獨文件(例如關於設置的數據庫連接位於connections.js內)。 其次是在環境基礎文件結構上配置,每個環境文件都在config/env文件夾中提供,每個文件包含特定env的設置。

Sails首先在config / env文件夾中查找,然後期待config / * .js

現在讓我們在config/local.js設置ssl。

var local = {
   port: process.env.PORT || 1337,
   environment: process.env.NODE_ENV || 'development'
};

if (process.env.NODE_ENV == 'production') {
    local.ssl = {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: require('fs').readFileSync(__dirname + '/path/to/ca.crt','ascii'),
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key','ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt','ascii')
    };
    local.port = 443; // This port should be different than your default port
}

module.exports = local;

另外,你也可以在config / env / production.js中添加它。 (這段代碼還演示瞭如何處理多個CARoot certi)

或者在production.js中

module.exports = {
    port: 443,
    ssl: {
        secureProtocol: 'SSLv23_method',
        secureOptions: require('constants').SSL_OP_NO_SSLv3,
        ca: [
            require('fs').readFileSync(__dirname + '/path/to/AddTrustExternalCARoot.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSAAddTrustCA.crt', 'ascii'),
            require('fs').readFileSync(__dirname + '/path/to/COMODORSADomainValidationSecureServerCA.crt', 'ascii')
        ],
        key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key', 'ascii'),
        cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt', 'ascii')
    }
};

http / https&ws / wss重定向

這裡ws是Web Socket,wss代表Secure Web Socket,當我們設置ssl時,現在http和ws這兩個請求都變得安全並分別轉換為https和wss。

我們的應用程序有很多來源會收到像任何博客帖子,社交媒體帖子的請求,但我們的服務器只在https上運行,所以當任何請求來自http時,它會在客戶端瀏覽器中顯示“本網站無法訪問”錯誤。 我們損失了我們的網站流量。 所以我們必須將http請求重定向到https,同樣的規則允許websocket,否則套接字將失敗。

所以我們需要在端口80(http)上運行相同的服務器,並將所有請求轉移到端口443(https)。 在提升服務器之前,Sails首先編譯config / bootstrap.js文件。 我們可以在端口80上啟動我們的express服務器。

在config / bootstrap.js(創建http服務器並將所有請求重定向到https)

module.exports.bootstrap = function(cb) {
    var express = require("express"),
        app = express();

    app.get('*', function(req, res) {  
        if (req.isSocket) 
            return res.redirect('wss://' + req.headers.host + req.url)  

        return res.redirect('https://' + req.headers.host + req.url)  
    }).listen(80);
    cb();
};

現在您可以訪問http://www.yourdomain.com ,它會重定向到https://www.yourdomain.com