web-dev-qa-db-ja.com

Node.jsでHTTPSサーバーを作成する方法

SSLキーと証明書を考えて、どのようにしてHTTPSサービスを作成しますか?

319
murvinlai

私は以下の例を見つけました。

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

これはノードv0.1.94 - v0.3.1で機能します。 server.setSecure()は、新しいバージョンのnodeでは削除されました。

そのソースから直接:

const crypto = require('crypto'),
  fs = require("fs"),
  http = require("http");

var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();

var credentials = crypto.createCredentials({key: privateKey, cert: certificate});

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

var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
135
hvgotcodes

Express APIドキュメント は、これを明確に説明しています。

さらに この答え は自己署名証明書を作成する手順を示しています。

Node.js HTTPSドキュメント :からのコメントとスニペットを追加しました。

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

// This line is from the Node.js HTTPS documentation.
var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};

// Create a service (the app object is just a callback).
var app = express();

// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
441
Jacob Marble

"node https"をグーグルしている間にこの質問を見つけました、しかし 受け入れられた答え の例は非常に古いです - ノードの現在の(v0.10)バージョンの docs から取られるべきです、こんな風に見える:

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

var options = {
  key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
  cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};

https.createServer(options, function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}).listen(8000);
82
pkyeck

上記の答えは良いですが、Expressとnodeではこれでうまくいきます。

Expressはあなたのためにアプリを作成するので、ここではスキップします。

var express = require('express')
  , fs = require('fs')
  , routes = require('./routes');

var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();  

// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
47
nu1silva

更新

Greenlock.js を使用してLet's Encryptを使用します

元の投稿

これらの答えのいずれも、チェーンに中間ルートCAを追加することを示していないことに気付きました。以下にいくつかのzero-configの例を示します。

スニペット:

var options = {
  // this is the private key only
  key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))

// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))

// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};

var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

var insecureServer = http.createServer();
server.listen(80, function () {
  console.log("Listening on " + server.address().address + ":" + server.address().port);
});

これは、do n't connectまたはexpressを介して直接行うことを試みますが、ネイティブhttpsモジュールがそれを処理し、それを使用してサービスを提供する場合、しばしば簡単になるものの1つです。接続/エクスプレスアプリ。

また、サーバーの作成時にアプリを渡す代わりにserver.on('request', app)を使用すると、serverインスタンスを、接続/エクスプレスアプリを作成する初期化関数に渡すことができます(必要な場合) do websockets同じサーバー上のssl経由など)。

18
CoolAJ86

Node.jsでのHTTPSサーバーの最小限の設定は、次のようになります。

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

https.createServer(httpsOptions, app).listen(4433);

Httpリクエストもサポートしたい場合は、この小さな変更を加える必要があります。

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

var httpsOptions = {
    key: fs.readFileSync('path/to/server-key.pem'),
    cert: fs.readFileSync('path/to/server-crt.pem')
};

var app = function (req, res) {
  res.writeHead(200);
  res.end("hello world\n");
}

http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
17
John Slegers

アプリがポート80443でそれぞれhttphttpsをリ​​スンできるようにするには、次の手順を実行します。

エクスプレスアプリを作成します。

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

express()が返すアプリはJavaScriptの関数です。リクエストを処理するためのコールバックとしてノードのHTTPサーバーに渡すことができます。これにより、同じコードベースを使用して、アプリケーションのHTTPバージョンとHTTPSバージョンの両方を簡単に提供できます。

次のようにすることができます。

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

var options = {
  key: fs.readFileSync('/path/to/key.pem'),
  cert: fs.readFileSync('/path/to/cert.pem')
};

http.createServer(app).listen(80);
https.createServer(options, app).listen(443);

完全な詳細については doc を参照してください。

7
cmd