SSLキーと証明書を前提として、どのようにHTTPSサービスを作成しますか?
SSLキーと証明書を前提として、どのようにHTTPSサービスを作成しますか?
回答:
次の例を見つけました。
これはノード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);
setSecure
廃止予定です。代わりに、このチェックアウトstackoverflow.com/questions/5136353/node-js-https-secure-error
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);
options
にhttps.createServer
、必ず最初に入れてください。
「ノード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);
*.pem
ですか()?このページをたどってみlocalhost:8000
ましたが、ブラウザーで開いたときにデータが受信されません(ロードするだけです...)。
openssl
、次にcmdプロンプトでopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
。HTTPはHTTPSではありません。
上記の回答は適切ですが、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});
module.exports
?その必要はありません
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);
使用してみましょうの暗号化を経由して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を実行する場合は、例)。
両方をリッスンするようにアプリを有効にするにhttp
してhttps
ポートで80
と443
、それぞれ、次の操作を行います
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);
詳細については、ドキュメントを参照してください
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
テストを作成する必要がある場合は実行してファイルを作成します)