express.jsサーバーのSSL証明書を設定するにはどうすればよいですか?


128

以前は、古いバージョンのExpressでこれを行うことができました。

express.createServer({key:'keyFile', cert:'certFile'});

ただし、新しいバージョンのexpressでは、これは機能しません。

var app = express();

app.use()証明書を設定するために呼び出す必要がありますか?もしそうなら?

回答:


151

Expressのドキュメント、https.createServerノードのドキュメントを参照してください(これは、Expressが使用することをお勧めします)。

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

https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(port);

createServerの他のオプションは次の場所にあります:http : //nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener


ノードからのフム:https.createServer(options、[requestListener])なので、アプリを渡すことは大丈夫ですか?そのアプリは「オブジェクト」ではありません...
murvinlai

1
「アプリ」の関数シグネチャは何ですか?私はエクスプレスのためにgithubを調べようとしますが、それが(req、res)を必要とすることはわかりません
murvinlai

1
createServerin の定義を見てみましょうconnect.js(expressは単にconnectから継承します)。正しいシグネチャを持つ関数を返すことがわかります。connect()は単にのエイリアスでconnect.createServer()あり、したがってエイリアスでもありますexpress()(これにより、追加の初期化が行われる可能性がありますが、結果は要求ハンドラとしての使用に適切な関数です)。
ebohlman 2012

11
@Qix-OPの例でappは、定義されています。この答えは満足です。
セイリア2014年

4
.pemファイルを取得する方法の概要はありますか?証明書プロバイダーからの2つの.crtファイルがあります。
SCBuergel.eth

103

次のボイラープレートコードでSSLを機能させることができました。

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

var port = 8000;

var options = {
    key: fs.readFileSync('./ssl/privatekey.pem'),
    cert: fs.readFileSync('./ssl/certificate.pem'),
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

app.get('/', function (req, res) {
    res.writeHead(200);
    res.end("hello world\n");
});

1
実際にブラウザでhello worldをどのように表示しますか?127.0.0.1:8000でエラー107(net :: ERR_SSL_PROTOCOL_ERROR):SSLプロトコルエラーが発生します。
aCuria

賛成投票が早すぎます。取得-エラー:addListenerはFunctionのインスタンスのみを受け取ります
Meekohi

かなり前に書かれたことを覚えておいてください。これはExpressまたはNode.jsの新しいバージョンでは機能しない可能性があります
geoffreak 2013年

8
これは何年も遅すぎますが、SSL_PROTOCOL_ERRORはhttp:// <ssl_enabled_endpoint>を使用していることが原因である可能性があります。https:// <ssl_enabled_endpoint>
andreimarinescu

9

これは、Express 4.0で使用できるコードです。

Express 4.0は3.0やその他のものとは大きく異なります。

4.0 / bin / wwwファイルがあり、ここにhttpsを追加します。

「npm start」は、Express 4.0サーバーを起動する標準的な方法です。

readFileSync()関数は__dirnameを使用して現在のディレクトリを取得する必要があります

require()は./使用し、現在のディレクトリを参照します。

まず、/ binフォルダーにprivate.keyとpublic.certファイルを置きます。これはWWWファイルと同じフォルダーです

そのようなディレクトリは見つかりませんエラー:

  key: fs.readFileSync('../private.key'),

  cert: fs.readFileSync('../public.cert')

エラー、そのようなディレクトリは見つかりません

  key: fs.readFileSync('./private.key'),

  cert: fs.readFileSync('./public.cert')

作業コードは

key: fs.readFileSync(__dirname + '/private.key', 'utf8'),

cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')

完全なhttpsコードは次のとおりです。

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

// readFileSync function must use __dirname get current directory
// require use ./ refer to current directory.

const options = {
   key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
  cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
};


 // Create HTTPs server.

 var server = https.createServer(options, app);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.