Làm cách nào để thiết lập chứng chỉ SSL cho máy chủ express.js?


128

Trước đây, trong một phiên bản cũ hơn của express, tôi có thể làm điều này:

express.createServer({key:'keyFile', cert:'certFile'});

Tuy nhiên, trong các phiên bản mới hơn của express này không còn hoạt động:

var app = express();

Tôi có nên gọi app.use()để đặt certs? Nếu vậy thì thế nào?

Câu trả lời:


151

Xem tài liệu Express cũng như tài liệu Node cho https.createServer (đây là những gì Express khuyên bạn nên sử dụng):

var privateKey = fs.readFileSync( 'privatekey.pem' );
var certificate = fs.readFileSync( 'certificate.pem' );

https.createServer({
    key: privateKey,
    cert: certificate
}, app).listen(port);

Các tùy chọn khác cho createdServer có tại: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener


Hmmm từ nút: https.createServer (tùy chọn, [requestListener]) để vượt qua ứng dụng có ổn không? không phải ứng dụng đó là một 'đối tượng' ...
murvinlai

1
Chữ ký chức năng cho 'ứng dụng' là gì? tôi cố gắng tìm kiếm trên github để thể hiện nhưng tôi không thấy rằng nó cần (req, res)
murvinlai

1
Hãy xem định nghĩa của createServerin connect.js(express chỉ thừa hưởng điều này từ kết nối). Bạn sẽ thấy rằng nó trả về một hàm với chữ ký chính xác. connect()chỉ đơn giản là một bí danh connect.createServer()và do đó cũng vậy express()(có thể thực hiện thêm một số khởi tạo, nhưng kết quả vẫn là một chức năng phù hợp để sử dụng như một trình xử lý yêu cầu).
ebohlman

11
@Qix - trong ví dụ OP, appđược xác định. Câu trả lời này là thỏa đáng.
Seiyria

4
Có bất kỳ phác thảo làm thế nào để có được các tập tin .pem? Tôi có hai tệp .crt từ nhà cung cấp chứng chỉ của mình.
SCBuergel.eth

103

Tôi đã có thể làm cho SSL hoạt động với mã soạn sẵn sau đây:

var fs = require('fs'),
    http = require('http'),
    https = require('https'),
    express = require('express');

var port = 8000;

var options = {
    key: fs.readFileSync('./ssl/privatekey.pem'),
    cert: fs.readFileSync('./ssl/certificate.pem'),
};

var app = express();

var server = https.createServer(options, app).listen(port, function(){
  console.log("Express server listening on port " + port);
});

app.get('/', function (req, res) {
    res.writeHead(200);
    res.end("hello world\n");
});

1
Làm thế nào để bạn thực sự nhìn thấy thế giới xin chào trên trình duyệt? 127.0.0.1:8000 mang đến cho tôi Lỗi 107 (net :: ERR_SSL_PROTOCOL_ERROR): Lỗi giao thức SSL.
aCuria

nâng cấp quá sớm. Tôi nhận được - Lỗi: addListener chỉ nhận các phiên bản của Hàm
Meekohi

hãy nhớ rằng đã được viết cách đây khá lâu. Có thể điều này không còn hoạt động trong các phiên bản mới hơn của Express hoặc Node.js
geoffreak 21/03/13

8
Đây là năm quá muộn, nhưng SSL_PROTOCOL_ERROR có thể được gây ra bởi thực tế là bạn đang sử dụng http: // <ssl_enables_endpoint>. Nó phải là https: // <ssl_enables_endpoint>
andreimarinescu

9

Đây là mã làm việc của tôi cho express 4.0 .

express 4.0 rất khác so với 3.0 và các loại khác.

4.0 bạn có tập tin / bin / www mà bạn sẽ thêm https vào đây.

"Npm start" là cách tiêu chuẩn để bạn bắt đầu máy chủ express 4.0.

Hàm readFileSync () nên sử dụng __dirname lấy thư mục hiện tại

trong khi yêu cầu () sử dụng ./ tham khảo thư mục hiện tại.

Đầu tiên bạn đặt tập tin private.key và public.cert vào thư mục / bin, Nó giống với thư mục WWW .

không tìm thấy thư mục như vậy lỗi:

  key: fs.readFileSync('../private.key'),

  cert: fs.readFileSync('../public.cert')

lỗi, không tìm thấy thư mục như vậy

  key: fs.readFileSync('./private.key'),

  cert: fs.readFileSync('./public.cert')

Mã làm việc phải là

key: fs.readFileSync(__dirname + '/private.key', 'utf8'),

cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')

Mã https hoàn chỉnh là:

const https = require('https');
const fs = require('fs');

// readFileSync function must use __dirname get current directory
// require use ./ refer to current directory.

const options = {
   key: fs.readFileSync(__dirname + '/private.key', 'utf8'),
  cert: fs.readFileSync(__dirname + '/public.cert', 'utf8')
};


 // Create HTTPs server.

 var server = https.createServer(options, app);
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.