Bagaimana cara membuat server HTTPS di Node.js?

361

Dengan kunci dan sertifikat SSL, bagaimana cara membuat layanan HTTPS?

murvinlai
sumber
2
Saya menggunakan restify.js alih-alih express.js , tetapi idenya sama. Inilah cara saya mengatur server node.js yang menerima HTTP dan HTTPS qugstart.com/blog/node-js/…
menunggu
2
tanpa express dan dengan versi terbaru dari node - lihat di sini: stackoverflow.com/a/21809393/388026
pkyeck
1
Apa yang terjadi dengan pertanyaan ini? Jawabannya menyiratkan bahwa ini awalnya tentang express.js.
doug65536
itu sepele untuk membuat sertifikat SSL yang ditandatangani sendiri dan meluncurkan server HTTPS, hanya beberapa langkah
Lloyd
3
Agak terlambat, tetapi jika seseorang membutuhkan tutorial lengkap nodejs https, bisa temukan di sini: programmerblog.net/nodejs-https-server
Jason W

Jawaban:

151

Saya menemukan contoh berikut.

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

Ini berfungsi untuk simpul v0.1.94 - v0.3.1. server.setSecure()dihapus di versi node yang lebih baru.

Langsung dari sumber itu:

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);
hvgotcodes
sumber
3
setSecuresudah ditinggalkan. Alih-alih, periksa ini stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle
7
Lihat jawaban cepat resmi di bawah ini oleh @ Jacob Marble.
clayzermk1
21
Sampel ini tidak berfungsi lagi karena implementasi HTTPS dilakukan kembali di Node.JS 0.4. Lihat dokumen terkait di nodejs.org. stackoverflow.com/questions/5136353/…
scottyab
11
Jawaban ini sudah sangat tua dan tidak berfungsi lagi. Silakan lihat jawabannya dengan pkyeck di bawah ini, atau buka: nodejs.org/api/https.html
Jay Sheth
2
Juga tautannya rusak
TlonXP
484

The Ekspres API doc mantra ini keluar cukup jelas.

Selain itu jawaban ini memberikan langkah-langkah untuk membuat sertifikat yang ditandatangani sendiri.

Saya telah menambahkan beberapa komentar dan cuplikan dari dokumentasi HTTPS Node.js :

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);
Jacob Marble
sumber
49
Bagus, baru saja memposting ini sendiri. Terima kasih. Selain itu, saya menemukan artikel ini bermanfaat untuk menghasilkan sertifikat yang ditandatangani sendiri.
clayzermk1
1
Pastikan Anda memasukkan optionsdulu https.createServer, untuk menghindari kesalahan samar.
wberry
1
Saya sedang menyiapkan port server https yang hampir identik 8888 dan tidak yakin bagaimana mengubah rute. ketika saya menjalankan curl curl --insecure localhost: 8888 curl: (35) Kesalahan protokol SSL tidak dikenal sehubungan dengan localhost: 8888 darimana datangnya kesalahan dan bagaimana cara mengatasinya. Ketika saya mengetik localhost: 8888 di browser, hang dan https: / localhost: 8888 memberikan kesalahan SSL
reza
2
@Costa Anda dapat mengarahkan pengguna dari http ke https dengan express-force-ssl atau middleware tulisan tangan - cukup mudah
floatdrop
1
@NathanMcKaskle Anda dapat menonaktifkan kata sandi: Periksa panduan ini tetapi jika Anda menggunakan macOS pastikan bahwa panjang kunci yang dihasilkan setidaknya 2048:openssl genrsa -out key.pem 2048
sakisk
87

Menemukan pertanyaan ini saat googling "node https" tetapi contoh dalam jawaban yang diterima sudah sangat tua - diambil dari dokumen versi node saat ini (v0.10), seharusnya terlihat seperti ini:

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);
pkyeck
sumber
Bekerja seperti pesona. Informasi ini sangat berguna ketika saya menjalankan alat node.js (PDFJS) di atas aplikasi PHP yang baru-baru ini dipaksa untuk berjalan di https. Iframe sangat tidak senang memuat aplikasi node.js saya pada port alternatif, non-https.
lewsid
2
Ini terlihat bagus, tetapi bagaimana saya bisa menghasilkan file yang Anda perlukan di sana ( *.pem)? Saya mencoba mengikuti halaman ini , tetapi ketika membuka localhost:8000di browser, tidak ada data yang diterima (hanya memuat ...).
Ionică Bizău
7
@ IonicăBizău, untuk menghasilkan kunci, instal openssl, lalu dalam cmd prompt, ketikopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido
2
@ IonicăBizău Anda harus langsung pergi ke https://localhost:8080. HTTP BUKAN HTTPS.
Florian Wendelborn
Apakah mungkin membuat https-server dengan folder? Jadi Anda dapat meletakkan file di dalamnya dan mengakses file itu seperti localhost: 81 / main.js
FrenkyB
47

Jawaban di atas baik tetapi dengan Express dan node ini akan berfungsi dengan baik.

Karena express membuat aplikasi untuk Anda, saya akan lewati itu di sini.

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});
nu1silva
sumber
Secara teknis ini adalah jawaban yang lebih benar, karena pertanyaannya adalah bagaimana melakukannya dengan Express.js
Kato
12
Ini tampaknya sudah usang karena "aplikasi tidak lagi mewarisi dari http.Server"
Merlyn Morgan-Graham
2
Mengapa Anda mengatur module.exports? Tidak perlu untuk itu
Matej
1
@matejkramny, mungkin karena itu membuatnya mudah untuk diuji.
Justin
21

Pengaturan minimal untuk server HTTPS di Node.js akan menjadi seperti ini:

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

Jika Anda juga ingin mendukung permintaan http, Anda hanya perlu membuat modifikasi kecil ini:

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);
John Slegers
sumber
18

Memperbarui

Gunakan Let's Encrypt via Greenlock.js

Pos Asli

Saya perhatikan bahwa tidak ada jawaban yang menunjukkan bahwa menambahkan CA Root Menengah ke rantai, berikut adalah beberapa contoh konfigurasi nol untuk dimainkan agar dapat melihat bahwa:

Potongan:

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

Ini adalah salah satu hal yang sering lebih mudah jika Anda tidak mencoba melakukannya secara langsung melalui koneksi atau express, tetapi biarkan httpsmodul asli menanganinya dan kemudian menggunakannya untuk melayani Anda menghubungkan / mengekspresikan aplikasi.

Juga, jika Anda menggunakan server.on('request', app)alih-alih melewati aplikasi saat membuat server, itu memberi Anda kesempatan untuk melewatkan serverinstance ke beberapa fungsi initializer yang membuat aplikasi connect / express (jika Anda ingin melakukan websockets melalui ssl pada server yang sama, untuk contoh).

CoolAJ86
sumber
Ini adalah penjelasan yang bagus tetapi, tautan yang disediakan di bagian pembaruan, rusak (memberikan 500 kesalahan)
Chucky
8

Untuk mengaktifkan aplikasi Anda untuk mendengarkan baik httpdan httpspada port 80dan 443masing-masing, melakukan hal berikut

Buat aplikasi ekspres:

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

Aplikasi yang dikembalikan oleh express()adalah fungsi JavaScript. Ini dapat diteruskan ke server HTTP Node sebagai panggilan balik untuk menangani permintaan. Ini membuatnya mudah untuk menyediakan versi HTTP dan HTTPS aplikasi Anda menggunakan basis kode yang sama.

Anda dapat melakukannya sebagai berikut:

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

Untuk detail lengkap, lihat dokumen

cmd
sumber
0

Anda juga dapat menggunakan arsip ini dengan kerangka kerja 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)

(dan jalankan openssl req -nodes -new -x509 -keyout server.key -out server.certuntuk membuat file jika Anda perlu menulis tes)

Manuel Spigolon
sumber
-4
  1. Unduh file rar untuk pengaturan openssl dari sini: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Cukup salin folder Anda di drive c.
  3. Buat file openssl.cnf dan unduh isinya dari: http://web.mit.edu/crypto/openssl.cnf openssl.cnf dapat diletakkan di mana saja tetapi path harus benar ketika kita memberikan command prompt.
  4. Buka perintah propmt dan set path openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5.B jalankan ini dalam cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Kemudian Jalankan OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Kemudian akan meminta frase lulus: masukkan 4 hingga 11 karakter sebagai kata sandi Anda untuk sertifikat
  7. Kemudian jalankan openssl> req -baru -kunci server.enc.key -out server.csr
  8. Kemudian akan meminta beberapa detail seperti nama negara kode negara dll. Isi secara bebas. 10. Kemudian Jalankan openssl> rsa -in server.enc.key -out server.key
  9. Jalankan OpenSSL ini> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt kemudian gunakan kode sebelumnya yang ada di stack overflow Terima kasih
Er Shubham Patidar
sumber
1
ini adalah PL . Pertanyaan OP jelas. Sertifikat sudah diberikan.
Martin Schneider