Làm cách nào để tạo máy chủ HTTPS trong Node.js?


360

Đượ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?


2
Tôi đã sử dụng restify.js thay vì express.js, nhưng ý tưởng là như nhau. Đây là cách tôi thiết lập máy chủ node.js chấp nhận cả HTTP và HTTPS qugstart.com/blog/node-js/ chủ
chờ

2
không có express và với phiên bản mới nhất của nút - xem tại đây: stackoverflow.com/a/21809393/388026
pkyeck

1
Điều gì đã xảy ra với câu hỏi này? Các câu trả lời ngụ ý rằng ban đầu là về express.js.
doug65536

Thật đơn giản để tạo chứng chỉ SSL tự ký hợp lệ và khởi chạy máy chủ HTTPS, chỉ một vài bước
Lloyd

3
Hơi muộn một chút nhưng nếu ai đó cần một hướng dẫn đầy đủ về nodejs https, có thể tìm thấy ở đây: lập trình viên lập trình điện tử / lập trình viên
Jason W

Câu trả lời:


150

Tôi tìm thấy ví dụ sau đây.

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

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

3
setSecurebị phản đối Hãy xem điều này thay vì stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle

7
Xem câu trả lời chính thức dưới đây của @Jacob Marble.
clayzermk1

21
Mẫu này không hoạt động nữa vì việc triển khai HTTPS đã được thực hiện lại trong Node.JS 0.4. Xem các tài liệu tương ứng tại nodejs.org. stackoverflow.com/questions/5136353/ từ
scottyab

11
Câu trả lời này rất cũ và không hoạt động nữa. Vui lòng xem câu trả lời bằng pkyeck bên dưới hoặc truy cập: nodejs.org/api/https.html
Jay Sheth

2
Ngoài ra, liên kết bị hỏng
TlonXP

484

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

49
Nice, chỉ là để gửi bài này cho mình. Cảm ơn bạn. Ngoài ra, tôi thấy bài viết này hữu ích cho việc tạo chứng chỉ tự ký.
clayzermk1

1
Hãy chắc chắn rằng bạn đặt optionsđầu tiên vào https.createServer, để tránh các lỗi khó hiểu.
dâu

1
Tôi đang thiết lập cổng máy chủ https gần như giống hệt 8888 và không biết cách thay đổi tuyến đường. khi tôi chạy curl curl --insecure localhost: 8888 curl: (35) Lỗi giao thức SSL không xác định trong kết nối với localhost: 8888 lỗi đến từ đâu và cách khắc phục. Khi tôi nhập localhost: 8888 trong trình duyệt, nó bị treo và https: / localhost: 8888 gây ra lỗi SSL
reza

2
@Costa bạn có thể chuyển hướng người dùng từ http sang https bằng express-force-ssl hoặc phần mềm trung gian viết tay - khá đơn giản
thả nổi

1
@NathanMcKaskle Bạn có thể tắt mật khẩu: Kiểm tra hướng dẫn này nhưng nếu bạn đang sử dụng macOS, hãy đảm bảo rằng độ dài khóa được tạo ít nhất là 2048:openssl genrsa -out key.pem 2048
sakisk

87

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

Làm việc như người ở. Thông tin này rất hữu ích khi tôi chạy một công cụ node.js (PDFJS) trên một ứng dụng PHP gần đây đã bị buộc phải chạy qua https. Khung nội tuyến rất không vui khi tải ứng dụng node.js của tôi trên một cổng không có https thay thế.
lewsid

2
Điều này có vẻ tốt, nhưng làm thế nào tôi có thể tạo các tệp bạn đang yêu cầu ở đó ( *.pem)? Tôi đã thử theo dõi trang này , nhưng khi mở localhost:8000trong trình duyệt, không nhận được dữ liệu nào (chỉ tải ...).
Ionică Bizău

7
@ IonicăBizău, để tạo khóa, cài đặt openssl, sau đó trong dấu nhắc cmd, gõopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido

2
@ IonicăBizău bạn cần trực tiếp đến https://localhost:8080. HTTP không phải là HTTPS.
Florian Wendelborn

Có thể tạo máy chủ https với thư mục không? Vì vậy, bạn có thể đặt tệp vào đó và truy cập tệp đó như localhost: 81 / main.js
FrenkyB

47

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

Về mặt kỹ thuật, đây là câu trả lời đúng hơn, vì câu hỏi là làm thế nào để làm điều đó với Express.js
Kato

12
Điều này dường như không được chấp nhận vì "các ứng dụng không còn kế thừa từ http.Server"
Merlyn Morgan-Graham

2
Tại sao bạn thiết lập module.exports? Không cần điều đó
Matej

1
@matejkramny, có lẽ vì nó dễ kiểm tra.
Justin

21

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

18

Cập nhật

Sử dụng Let Encrypt thông qua Greenlock.js

Bài gốc

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 để httpsmô-đ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 serverthể 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ụ).


Đây là một lời giải thích hay, nhưng, liên kết được cung cấp trong phần cập nhật, đã bị hỏng (đưa ra 500 lỗi)
Chucky

8

Để cho phép ứng dụng của bạn nghe cả hai httphttpstrên các cổng 80443tươ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


0

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)


-4
  1. Tải xuống tệp rar cho openssl được thiết lập từ đây: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Chỉ cần sao chép thư mục của bạn trong ổ đĩa c.
  3. Tạo tệp openssl.cnf và tải xuống nội dung của chúng từ: http://web.mit.edu/crypto/openssl.cnf openssl.cnf có thể được đặt ở bất kỳ đâu nhưng đường dẫn sẽ chính xác khi chúng tôi đưa ra dấu nhắc lệnh.
  4. Mở lệnh propmt và đặt đường dẫn openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5.Run này trong cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Sau đó chạy OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Sau đó, nó sẽ yêu cầu các cụm mật khẩu: nhập 4 đến 11 ký tự làm mật khẩu của bạn để lấy chứng chỉ
  7. Sau đó chạy Openssl> req -new -key server.enc.key -out server.csr
  8. Sau đó, nó sẽ yêu cầu một số chi tiết như tên quốc gia mã quốc gia, vv điền nó một cách tự do. 10. Sau đó, chạy Openssl> rsa -in server.enc.key -out server.key
  9. Chạy OpenSSL> x509 -req -day 365 -in server.csr -signkey server.key -out server.crt sau đó sử dụng mã trước đó đang bị tràn stack Cảm ơn

1
đây là OT . Câu hỏi của OP rất rõ ràng. Giấy chứng nhận đã được đưa ra.
Martin Schneider
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.