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


360

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


2
私はexpress.jsの代わりにrestify.jsを使用しましたが、考え方は同じです。ここで私はHTTPとHTTPSの両方受け入れのNode.jsサーバーの設定方法ですqugstart.com/blog/node-js/...
awaage

2
エクスプレスなし、ノードの最新バージョンあり-ここを見てください:stackoverflow.com/a/21809393/388026
pkyeck

1
この質問はどうなりましたか?答えは、それがもともとはexpress.jsに関するものであることを示しています。
doug65536 2015年

有効な自己署名SSL証明書を作成してHTTPSサーバーを起動するのはほんの数ステップです
Lloyd

3
それは少し遅いですが、誰かが完全なnodejs httpsチュートリアルを必要とする場合、ここで見つけることができます: programmerblog.net/nodejs-https-server
Jason W

回答:


150

次の例を見つけました。

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()新しいバージョンのノードでは削除されます。

そのソースから直接:

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);

3
setSecure廃止予定です。代わりに、このチェックアウトstackoverflow.com/questions/5136353/node-js-https-secure-error
ラリー・バトル

7
@Jacob Marbleによる以下の公式の明白な回答を参照してください。
clayzermk1

21
HTTPS実装がNode.JS 0.4で再実行されたため、このサンプルは機能しなくなりました。nodejs.orgで対応するドキュメントを参照してください。stackoverflow.com/questions/5136353/...
scottyab

11
この回答は非常に古く、機能しません。下記のpkyeckによる回答を参照するか、次のURLにアクセスしてください:nodejs.org/api/https.html
Jay Sheth

2
また、リンクが壊れています
TlonXP

484

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);

49
ニース、これを自分で投稿しようとしていました。ありがとうございました。さらに、この記事は自己署名証明書の生成に役立ちました。
clayzermk1

1
不可解なエラーを回避するためoptionshttps.createServer、必ず最初に入れてください。
wberry 2013

1
ほとんど同じhttpsサーバーのポート8888をセットアップしていますが、ルートを変更する方法がわかりません。curl curl --insecure localhost:8888 curl:(35)を実行すると、localhost:8888への接続で不明なSSLプロトコルエラーが発生し、エラーの原因と回避策が示されます。ブラウザにlocalhost:8888と入力すると、ハングし、https:/ localhost:8888でSSLエラーが発生します
reza

2
@Costaは、express-force-sslまたは手書きのミドルウェアを使用して、httpからhttpsにユーザーをリダイレクトできます- かなり簡単です
floatdrop

1
@NathanMcKaskleパスワードを無効にすることができます。このチェックガイドが、あなたはMacOSのを使用している場合に生成される鍵の長さは、少なくとも2048であることを確認してください:openssl genrsa -out key.pem 2048
sakisk

87

「ノードhttps」をグーグル検索しているときにこの質問を見つけましたが、受け入れられた回答の例は非常に古く、現在の(v0.10)バージョンのノードのドキュメントから取得すると、次のようになります。

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);

魅力のように働いた。最近httpsでの実行を強制されたPHPアプリの上でnode.jsツール(PDFJS)を実行しているので、この情報は非常に役立ちました。iframeは、https以外の代替ポートにnode.jsアプリをロードするのに非常に不満でした。
lewsid 2014年

2
これはよさそうですが、必要なファイルをそこに生成するにはどうすればよい*.pemですか()?このページをたどってlocalhost:8000ましたが、ブラウザーで開いたときにデータが受信されません(ロードするだけです...)。
IonicăBizău

7
@IonicăBizău、キーを生成するために、インストールしopenssl、次にcmdプロンプトでopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido

2
@IonicăBizăuに直接アクセスする必要がありますhttps://localhost:8080。HTTPはHTTPSではありません。
Florian Wendelborn 2015

フォルダでhttpsサーバーを作成することは可能ですか?したがって、そこにファイルを入れて、localhost:81 / main.jsの
FrenkyB

47

上記の回答は適切ですが、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});

質問はExpress.jsでそれを行う方法であったため、技術的にはこれがより正解です
Kato

12
「アプリケーションがhttp.Serverを継承しなくなった」ため、これは推奨されないようです
Merlyn Morgan-Graham

2
なぜあなたは設定しますかmodule.exports?その必要はありません
マテジ2013年

1
@matejkramny、おそらくテストが容易になるためです。
ジャスティン

21

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);

18

更新

使用してみましょうの暗号化を経由してGreenlock.js

元の投稿

これらの回答のどれも、中間ルートCAをチェーンに追加することを示していないことに気づきました。これは、それを確認するために使用するいくつかのゼロ設定の例です:

スニペット:

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);
});

これは、あなたがあれば、多くの場合、簡単ですものの一つですしていない接続を介して直接それを行うか、発現するが、ネイティブできるようにしようとhttpsモジュールハンドルにそれをして、あなたは/接続アプリを表現提供するためにそれを使用します。

また、server.on('request', app)サーバーを作成するときにアプリを渡す代わりにを使用するとserver、接続/エクスプレスアプリを作成する初期化関数にインスタンスを渡すことができます(同じサーバーでsslを介してWebSocketを実行する場合は、例)。


これは素晴らしい説明ですが、更新セクションに提供されたリンクが壊れています(500エラーが発生します)
Chucky

8

両方をリッスンするようにアプリを有効にするにhttpしてhttpsポートで80443、それぞれ、次の操作を行います

Expressアプリを作成します。

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

によって返されるアプリはexpress()JavaScript関数です。リクエストを処理するためのコールバックとしてNodeの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);

詳細については、ドキュメントを参照してください


0

Fastifyフレームワークでこれをアーカイブすることもできます。

const { readFileSync } = require('fs')
const Fastify = require('fastify')

const fastify = Fastify({
  https: {
    key: readFileSync('./test/asset/server.key'),
    cert: readFileSync('./test/asset/server.cert')
  },
  logger: { level: 'debug' }
})

fastify.listen(8080)

openssl req -nodes -new -x509 -keyout server.key -out server.certテストを作成する必要がある場合は実行してファイルを作成します)


-4
  1. ここからセットアップされたopensslのrarファイルをダウンロードします:https : //indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. フォルダをCドライブにコピーするだけです。
  3. openssl.cnfファイルを作成し、そのコンテンツを次の 場所からダウンロードします。http: //web.mit.edu/crypto/openssl.cnf openssl.cnfはどこにでも置くことができますが、コマンドプロンプトでパスを指定すると正しいパスになります。
  4. コマンドpropmtを開き、openssl.cnfパスを設定しますC:\ set OPENSSL_CONF = d:/openssl.cnf 5.これをcmdで実行します:C:\ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. 次にOpenSSLを実行します> genrsa -des3 -out server.enc.key 1024
  6. 次に、パスフレーズを要求します。証明書のパスワードとして4〜11文字を入力します
  7. 次に、Openssl> req -new -key server.enc.key -out server.csrを実行します。
  8. 次に、国コードの州名などの詳細を尋ねます。自由に入力してください。10。次に、Openssl> rsa -in server.enc.key -out server.keyを実行します。
  9. このOpenSSLを実行します> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt次に、スタックオーバーフローにある以前のコードを使用しますありがとう

1
これはOTです。OPの質問は明確です。証明書はすでに与えられています。
Martin Schneider
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.