1. ホーム
  2. node.js

[解決済み] express.js で HTTPS を有効にする

2022-03-18 09:12:34

質問

express.js for node で 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()は重要ではないと思います。私は両方の組み合わせを使用しましたが、それでもno es buenoでした。


EDIT TO ADD:

本番システムでは、NginxやHAProxyを使って、nodejsアプリへのリクエストをプロキシするのがよいでしょう。nginxをセットアップしてsslリクエストを処理し、node app.jsにhttpで話しかけるだけです。

edit to add (4/6/2015)

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


解決するには?

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) を使用してください。