ฉันจะตั้งค่าใบรับรอง SSL สำหรับเซิร์ฟเวอร์ express.js ได้อย่างไร


128

ก่อนหน้านี้ใน Express เวอร์ชันเก่าฉันสามารถทำได้:

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

อย่างไรก็ตามในเวอร์ชันใหม่กว่าจะใช้งานไม่ได้อีกต่อไป:

var app = express();

ฉันควรโทรapp.use()ไปกำหนดใบรับรองหรือไม่? ถ้าเป็นอย่างไร

คำตอบ:


151

ดูเอกสาร Expressรวมทั้งเอกสาร Node สำหรับ https.createServer (ซึ่งเป็นสิ่งที่ Express แนะนำให้ใช้):

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

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

ตัวเลือกอื่น ๆ สำหรับ createServer อยู่ที่: http://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener


อืมจากโหนด: https.createServer (ตัวเลือก [requestListener]) ดังนั้นการส่งผ่านแอปก็โอเค? ไม่ใช่แอปนั้นเป็น 'วัตถุ' ...
murvinlai

1
ลายเซ็นของฟังก์ชันสำหรับ 'แอป' คืออะไร? ฉันพยายามค้นหาใน github สำหรับ express แต่ฉันไม่เห็นว่าต้องใช้ (req, res)
murvinlai

1
ดูคำจำกัดความของcreateServerin connect.js(express เพียงสืบทอดสิ่งนี้จากการเชื่อมต่อ) คุณจะเห็นว่ามันส่งคืนฟังก์ชันที่มีลายเซ็นที่ถูกต้อง connect()เป็นเพียงนามแฝงสำหรับconnect.createServer()ดังนั้นจึงเป็นเช่นนั้นexpress()(ซึ่งอาจเป็นการเริ่มต้นเพิ่มเติมบางอย่าง แต่ผลลัพธ์ก็ยังคงเป็นฟังก์ชันที่เหมาะสมสำหรับใช้เป็นตัวจัดการคำขอ)
ebohlman

11
@Qix - ในตัวอย่าง OPs appถูกกำหนดไว้ คำตอบนี้เป็นที่น่าพอใจ
Seiyria

4
มีโครงร่างวิธีการรับไฟล์. pem หรือไม่? ฉันมีไฟล์. crt สองไฟล์จากผู้ให้บริการใบรับรองของฉัน
SCBuergel.eth

103

ฉันสามารถทำให้ SSL ทำงานกับรหัสต้นแบบต่อไปนี้:

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
คุณเห็นโลกแห่งความสวัสดีบนเบราว์เซอร์ได้อย่างไร? 127.0.0.1:8000ให้ข้อผิดพลาด 107 (net :: ERR_SSL_PROTOCOL_ERROR): ข้อผิดพลาดโปรโตคอล SSL
aCuria

โหวตเร็วเกินไป ฉันได้รับ - ข้อผิดพลาด: addListener ใช้เฉพาะอินสแตนซ์ของฟังก์ชันเท่านั้น
Meekohi

โปรดทราบว่าได้เขียนไว้เมื่อไม่นานมานี้ เป็นไปได้ว่าสิ่งนี้จะใช้ไม่ได้ใน Express หรือ Node.js เวอร์ชันใหม่กว่าอีกต่อไป
geoffreak

8
หลายปีที่ผ่านมา แต่ SSL_PROTOCOL_ERROR อาจเกิดจากการที่คุณใช้ http: // <ssl_enabled_endpoint> ควรเป็น https: // <ssl_enabled_endpoint>
andreimarinescu

9

นี้เป็นของฉันทำงานรหัสสำหรับด่วน 4.0

express 4.0 แตกต่างจาก 3.0 และอื่น ๆ มาก

4.0 คุณมีไฟล์ / bin / www ซึ่งคุณจะเพิ่ม https ที่นี่

"npm start" เป็นวิธีมาตรฐานในการเริ่มเซิร์ฟเวอร์ Express 4.0

readFileSync () ฟังก์ชันควรใช้__dirname get current directory

ในขณะที่ต้องใช้ () ใช้. /อ้างถึงไดเร็กทอรีปัจจุบัน

ครั้งแรกที่คุณใส่ private.key และ public.cert ไฟล์ภายใต้โฟลเดอร์ bin / มันเป็นโฟลเดอร์เดียวกันเป็นแฟ้ม

ไม่พบไดเรกทอรีดังกล่าวข้อผิดพลาด:

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

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

ข้อผิดพลาดไม่พบไดเรกทอรีดังกล่าว

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

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

รหัสการทำงานควรเป็น

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

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

รหัส https ที่สมบูรณ์คือ:

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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.