558

ノードの Express.js で HTTPS を動作させようとしていますが、わかりません。

これは私の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 リクエストにのみ応答するようです。

簡単なバニラ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 を伝えるだけです。

編集して追加 (2015 年 4 月 6 日)

AWS を使用するシステムの場合、EC2 Elastic Load Balancer を使用して SSL ターミネーションを処理し、EC2 Web サーバーへの通常の HTTP トラフィックを許可することをお勧めします。セキュリティを強化するには、ELB のみが HTTP トラフィックを EC2 インスタンスに送信できるようにセキュリティ グループを設定します。これにより、外部の暗号化されていない HTTP トラフィックがマシンに到達するのを防ぐことができます。


4

9 に答える 9

852

Express.js (バージョン 3 以降) では、次の構文を使用する必要があります。

var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey  = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');

var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();

// your express configuration here

var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);

httpServer.listen(8080);
httpsServer.listen(8443);

このようにして、高速ミドルウェアをネイティブの http/https サーバーに提供します。

1024 未満のポートでアプリを実行する場合は、sudoコマンド (非推奨) を使用するか、リバース プロキシ (nginx、haproxy など) を使用する必要があります。

于 2012-07-31T16:48:09.360 に答える
32

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 を指定し、それに応じてサーバーを作成する必要があります。また、使用しようとしているポートが実際に受信トラフィックを許可していることを確認してください。

于 2016-02-25T13:01:08.137 に答える