Được cấp một khóa SSL và chứng chỉ, làm thế nào để tạo một dịch vụ HTTPS?
Được cấp một khóa SSL và chứng chỉ, làm thế nào để tạo một dịch vụ HTTPS?
Câu trả lời:
Tôi tìm thấy ví dụ sau đây.
Điều này hoạt động cho nút v0.1.94 - v0.3.1. server.setSecure()
được loại bỏ trong các phiên bản mới hơn của nút.
Trực tiếp từ nguồn đó:
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
bị phản đối Hãy xem điều này thay vì stackoverflow.com/questions/5136353/node-js-https-secure-error
Tài liệu API Express thể hiện điều này khá rõ ràng.
Ngoài ra , câu trả lời này cung cấp các bước để tạo chứng chỉ tự ký.
Tôi đã thêm một số nhận xét và đoạn trích từ tài liệu HTTPS của 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
đầu tiên vào https.createServer
, để tránh các lỗi khó hiểu.
Đã tìm thấy câu hỏi này trong khi googling "nút https" nhưng ví dụ trong câu trả lời được chấp nhận là rất cũ - được lấy từ các tài liệu của phiên bản nút (v0.10) hiện tại, nó sẽ giống như thế này:
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
)? Tôi đã thử theo dõi trang này , nhưng khi mở localhost:8000
trong trình duyệt, không nhận được dữ liệu nào (chỉ tải ...).
openssl
, sau đó trong dấu nhắc cmd, gõopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP không phải là HTTPS.
Các câu trả lời trên là tốt nhưng với Express và nút này sẽ hoạt động tốt.
Vì express tạo ứng dụng cho bạn, tôi sẽ bỏ qua nó ở đây.
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
? Không cần điều đó
Thiết lập tối thiểu cho máy chủ HTTPS trong Node.js sẽ giống như thế này:
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);
Nếu bạn cũng muốn hỗ trợ các yêu cầu http, bạn chỉ cần thực hiện sửa đổi nhỏ này:
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);
Sử dụng Let Encrypt thông qua Greenlock.js
Tôi nhận thấy rằng không có câu trả lời nào trong số này cho thấy rằng việc thêm một Root Root CA vào chuỗi, đây là một số ví dụ cấu hình zero để chơi với điều đó:
Đoạn trích:
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);
});
Đây là một trong những điều thường dễ dàng hơn nếu bạn không thử thực hiện trực tiếp thông qua kết nối hoặc thể hiện, nhưng hãy để https
mô-đun gốc xử lý nó và sau đó sử dụng nó để phục vụ bạn kết nối / thể hiện ứng dụng.
Ngoài ra, nếu bạn sử dụng server.on('request', app)
thay vì chuyển ứng dụng khi tạo máy chủ, nó sẽ cho bạn cơ hội chuyển server
thể hiện sang một số chức năng khởi tạo tạo ứng dụng kết nối / chuyển phát nhanh (nếu bạn muốn thực hiện websockets qua ssl trên cùng một máy chủ, cho thí dụ).
Để cho phép ứng dụng của bạn nghe cả hai http
và https
trên các cổng 80
và 443
tương ứng, hãy làm như sau
Tạo một ứng dụng thể hiện:
var express = require('express');
var app = express();
Ứng dụng được trả về bởi express()
một hàm JavaScript. Nó có thể được chuyển đến các máy chủ HTTP của Node dưới dạng gọi lại để xử lý các yêu cầu. Điều này giúp dễ dàng cung cấp cả phiên bản HTTP và HTTPS cho ứng dụng của bạn bằng cùng một cơ sở mã.
Bạn có thể làm như sau:
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);
Để biết chi tiết đầy đủ, xem tài liệu
Bạn cũng có thể sử dụng lưu trữ này với khung 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)
(và chạy openssl req -nodes -new -x509 -keyout server.key -out server.cert
để tạo các tệp nếu bạn cần viết bài kiểm tra)