รับรหัส 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
doc ด่วน APIคาถานี้ออกสวยอย่างชัดเจน
นอกจากนี้คำตอบนี้ให้ขั้นตอนในการสร้างใบรับรองที่ลงนามด้วยตนเอง
ฉันได้เพิ่มความคิดเห็นและตัวอย่างจากเอกสาร 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
ก่อนhttps.createServer
เพื่อหลีกเลี่ยงข้อผิดพลาดที่คลุมเครือ
พบคำถามนี้ในขณะที่ googling "node https" แต่ตัวอย่างในคำตอบที่ยอมรับนั้นเก่ามาก - นำมาจากdocsของโหนดรุ่นปัจจุบัน (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 prompt พิมพ์openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
IonicăBizăuคุณจำเป็นต้องไป HTTP ไม่ใช่ HTTPS
คำตอบข้างต้นนั้นดี แต่ด้วย Express และ node สิ่งนี้จะใช้ได้ดี
ตั้งแต่สร้างแอปด่วนสำหรับคุณฉันจะข้ามไปที่นี่
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
? ไม่จำเป็นต้องทำเช่นนั้น
การตั้งค่าขั้นต่ำสำหรับเซิร์ฟเวอร์ HTTPS ใน Node.js จะเป็นดังนี้:
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);
ใช้ Let's Encrypt ผ่านGreenlock.js
ฉันสังเกตเห็นว่าไม่มีคำตอบใด ๆ ที่แสดงให้เห็นว่าการเพิ่มIntermediate Root CAให้กับ chain นี่คือตัวอย่างZero-config ที่จะใช้ดู:
ตัวอย่างข้อมูล:
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
อินสแตนซ์ไปยังฟังก์ชัน initializer บางตัวที่สร้างแอปเชื่อมต่อ / ด่วน (ถ้าคุณต้องการทำเว็บซ็อกเก็ตผ่าน ssl บนเซิร์ฟเวอร์เดียวกัน ตัวอย่าง).
ต้องการเปิดใช้งานแอปของคุณเพื่อฟังทั้งสองhttp
และhttps
พอร์ต80
และ443
ตามลำดับทำดังต่อไปนี้
สร้างแอปด่วน:
var express = require('express');
var app = express();
แอปที่ส่งคืนโดยexpress()
เป็นฟังก์ชัน JavaScript มันสามารถส่งผ่านไปยังเซิร์ฟเวอร์ 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
เพื่อสร้างไฟล์หากคุณจำเป็นต้องเขียนการทดสอบ)
var path = require('path');
var express = require('express');
var app = express();
var staticPath = path.join(__dirname, '/public');
app.use(express.static(staticPath));
app.listen(8070, function() {
console.log('Server started at port 8070');
});