Bagaimana cara mengatur sertifikat SSL untuk server express.js?

128

Sebelumnya, dalam versi express yang lebih lama, saya bisa melakukan ini:

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

Namun, dalam versi ekspres yang lebih baru, ini tidak lagi berfungsi:

var app = express();

Haruskah saya menelepon app.use()untuk mengatur sertifikat? Kalau begitu bagaimana?

murvinlai
sumber

Jawaban:

151

Lihat Express docs serta Node docs untuk https.createServer (yang disarankan oleh express untuk digunakan):

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

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

Opsi lain untuk createServer ada di: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener

ebohlman
sumber
Hmmm dari node: https.createServer (opsi, [requestListener]) jadi aplikasi yang lewat ok? bukankah aplikasi itu adalah 'objek' ...
murvinlai
1
apa fungsi tanda tangan untuk 'aplikasi'? saya mencoba mencari di github untuk mengekspresikan tetapi saya tidak melihat itu diperlukan (req, res)
murvinlai
1
Lihatlah definisi createServerin connect.js(express just inherit this from connect). Anda akan melihat bahwa ia mengembalikan fungsi dengan tanda tangan yang benar. connect()hanyalah sebuah alias untuk connect.createServer()dan oleh karena itu express()(yang mungkin melakukan inisialisasi tambahan, tetapi hasilnya masih merupakan fungsi yang sesuai untuk digunakan sebagai penangan permintaan).
ebohlman
11
@Qix - dalam contoh OPs, appditentukan. Jawaban ini memuaskan.
Seiyria
4
apakah ada garis besar cara mendapatkan file .pem? Saya memiliki dua file .crt dari penyedia sertifikat saya.
SCBuergel.eth
103

Saya dapat membuat SSL bekerja dengan kode boilerplate berikut:

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");
});
geoffreak
sumber
1
Bagaimana Anda benar-benar melihat dunia halo di browser? 127.0.0.1:8000 memberi saya Kesalahan 107 (bersih :: ERR_SSL_PROTOCOL_ERROR): Kesalahan protokol SSL.
aCuria
dibatalkan terlalu cepat. Saya mendapatkan - Kesalahan: addListener hanya membutuhkan instance dari Function
Meekohi
perlu diingat bahwa itu ditulis beberapa waktu yang lalu. Mungkin ini tidak lagi berfungsi di versi Express atau Node.js yang lebih baru
geoffreak
8
Ini terlambat beberapa tahun, tetapi SSL_PROTOCOL_ERROR dapat disebabkan oleh kenyataan bahwa Anda menggunakan http: // <ssl_enabled_endpoint>. Seharusnya https: // <ssl_enabled_endpoint>
andreimarinescu
9

Ini adalah kode kerja saya untuk express 4.0 .

express 4.0 sangat berbeda dari 3.0 dan lainnya.

4.0 Anda memiliki file / bin / www, yang akan Anda tambahkan https di sini.

"npm start" adalah cara standar Anda memulai express 4.0 4.0 server.

Fungsi readFileSync () harus menggunakan __dirname untuk mendapatkan direktori saat ini

sementara membutuhkan () gunakan ./ merujuk ke direktori saat ini.

Pertama Anda meletakkan file private.key dan public.cert di bawah / bin folder, Ini adalah folder yang sama dengan file WWW .

tidak ada direktori yang ditemukan kesalahan:

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

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

kesalahan, tidak ada direktori yang ditemukan

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

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

Kode kerja seharusnya

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

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

Kode https lengkap adalah:

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