Dengan kunci dan sertifikat SSL, bagaimana cara membuat layanan HTTPS?
Dengan kunci dan sertifikat SSL, bagaimana cara membuat layanan HTTPS?
Jawaban:
Saya menemukan contoh berikut.
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);
setSecure
sudah ditinggalkan. Alih-alih, periksa ini stackoverflow.com/questions/5136353/node-js-https-secure-error
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);
options
dulu https.createServer
, untuk menghindari kesalahan samar.
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);
*.pem
)? Saya mencoba mengikuti halaman ini , tetapi ketika membuka localhost:8000
di browser, tidak ada data yang diterima (hanya memuat ...).
openssl
, lalu dalam cmd prompt, ketikopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP BUKAN HTTPS.
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});
module.exports
? Tidak perlu untuk itu
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);
Gunakan Let's Encrypt via Greenlock.js
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 https
modul 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 server
instance ke beberapa fungsi initializer yang membuat aplikasi connect / express (jika Anda ingin melakukan websockets melalui ssl pada server yang sama, untuk contoh).
Untuk mengaktifkan aplikasi Anda untuk mendengarkan baik http
dan https
pada port 80
dan 443
masing-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
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.cert
untuk membuat file jika Anda perlu menulis tes)