การสร้าง Self-signed certificate สำหรับรันเว็บไซต์บน Node.js และ Express.js

29 April 2023

ในบทความนี้ คุณจะได้เรียนรู้วิธีการสร้าง Self-signed SSL certificate เพื่อทำมาใช้งานกับเว็บไซต์ที่สร้างจาก Node.js และ Express.js ให้สามารถเข้าถึงผ่าน https ได้ บทความของเราจะเป็นการแสดงตัวอย่างบนระบบปฏิบัติการ Windows นี่เป็นเนื้อหาในบทนี้

  • Self-signed certificate คืออะไร
  • การติดตั้งโปรแกรม OpenSSL
  • การสร้าง Self-signed certificate
  • การสร้างเว็บไซต์ https ด้วย Express.js
  • การสร้างเว็บไซต์ https ด้วย Node.js

Self-signed certificate คืออะไร

Self-signed certificate คือใบรับรองที่ไม่ได้ออกโดยหน่วยงานออกใบรับรองที่น่าเชื่อถือ (Certificate authority) และเป็นใบรับรองที่ทุกคนสามารถสร้างขึ้นมาเองได้โดยไม่มีค่าใช้จ่าย นี่ทำให้มันเป็นใบรับรองที่ไม่มีความน่าเชื่อถือในการนำไปใช้งาน; Self-signed certificate เป็นรหัสสาธารณะที่จะช่วยทำให้เว็บไซต์สามารถเข้าถึงผ่าน https ได้และช่วยให้ข้อมูลได้รับการเข้ารหัสและมีความปลอดภัยมากขึ้น

Self-signed certificate มักจะถูกใช้ในระหว่างที่กำลังพัฒนาเว็บไซต์เท่านั้น มันไม่เหมาะที่จะนำไปใช้ในสภาพแวดล้อมของ Production เนื่องจากมันไม่มีความน่าเชื่อถือมากพอและเว็บเบราว์เซอร์ส่วนมากจะแสดงข้อความเตือนว่าเว็บไซต์ไม่ปลอดภัยเมื่อมีการนำ Certificate ที่สร้างเองไปใช้งานบนเว็บไซต์เหล่านั้น

การติดตั้งโปรแกรม OpenSSL

ในการสร้าง Self-signed certificate เราสามารถใช้โปรแกรม OpenSSL ซึ่งมีให้ดาวน์โหลดทั้งบนระบบปฏิบัติการ Windows, Linux และ MacOS และสำหรับ Windows คุณสามารถดาวน์โหลดโปรแกรมติดตั้งของมันได้ที่ https://slproweb.com/products/Win32OpenSSL.html

ให้เลือกดาวน์โหลดเวอร์ชัน Win64 OpenSSL v3.1.0 (EXE) และทำการติดตั้งตามที่ตัวติดตั้งของโปรแกรมแนะนำ จากนั้นเพิ่มที่อยู่นี้ลงบนตัวแปร System Path ในการตั้งค่าของ Environment Variables บนคอมพิวเตอร์ของคุณ

C:\Program Files\OpenSSL-Win64\bin

หากคุณใช้ระบบปฏิบัติการอื่นๆ ที่ไม่ใช่ Windows คุณสามารถบิวต์โปรแกรมจาก Source code ได้ สามารถดูวิธีทำได้ที่เว็บโซต์ทางการของมัน https://www.openssl.org/

การสร้าง Self-signed certificate

ขั้นตอนต่อไปจะเป็นการสร้าง Self-signed certificate เพื่อนำมาใช้งานกับเว็บไซต์ของเรา ก่อนอื่นให้คุณเปิด Terminal ขึ้นมาที่ไหนก็ได้แล้วทำตามขั้นตอนต่อไปนี้

1) ขั้นตอนแรก สร้างไฟล์ Private key ซึ่งเป็นรหัสลับที่จะนำมาใช้ในการสร้าง Self-signed certificate ด้วยคำสั่งต่อไปนี้ โดยเราจะได้รับไฟล์ที่มีชื่อว่า key.pem

openssl genrsa -out key.pem

2) จากนั้นสร้าง Certificate service request (CSR) ซึ่งเป็นไฟล์สำหรับเก็บข้อมูลที่จำเป็นเพื่อนำไปสร้าง Certificate นี่เป็นคำสั่งสำหรับสร้างไฟล์ CSR โดยมันจะมีคำถามต่างๆ ให้ตอบ คุณสามารถกด Enter เพื่อข้ามการตอบคำถามเหล่านั้นได้

openssl req -new -key key.pem -out csr.pem

3) สุดท้ายเป็นการสร้าง Certificate จากข้อมูลที่เราได้สร้างไปก่อนหน้านั่นคือ Private key และ CSR โดยใช้คำสั่งต่อไปนี้ นี่จะสร้างไฟล์ Certificate ที่มีชื่อว่า cert.pem

openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem

และตอนนี้เราก็สร้าง Self-signed certificate สำเร็จแล้ว นี่จะได้ทั้งหมดสามไฟล์มาเพื่อนำไปใช้งาน ต่อไปมาสร้างเว็บไซต์ด้วย Express.js เพื่อให้สามารถใช้งาน https ได้กันเลย

การสร้างเว็บไซต์ https ด้วย Express.js

สร้างโฟล์เดอร์ใหม่ขึ้นมาชื่อว่า marcuscode หรือคุณสามารถใช้ชื่ออื่นได้หากต้องการ เปิด Terminal ขึ้นมาในโฟล์เดอร์ดังกล่าวและใช้คำสั่งนี้เพื่อกำหนดค่าโปรเจ็ค Node.js

npm init

ต่อมาใช้คำสั่งนี้เพื่อติดตั้งแพ็กเกจ Express.js นี่จะเป็นแพ็กเกจที่จะใช้สำหรับสร้างเว็บเซิฟเวอร์

npm install express

ถัดมาให้คัดลอกไฟล์ key.pem และ cert.pem ที่ได้สร้างไปแล้วในขั้นตอนก่อนหน้ามาไว้ในโฟลเดอร์ของโปรเจ็คเพื่อนำมาใช้ในการสร้างเว็บเซิฟเวอร์

และนี่เป็นโค้ดของโปรแกรมที่สร้างเว็บไซต์อย่างง่ายด้วยแพ็กเกจ Express.js ให้คุณคัดลอกเนื้อหาในไฟล์และบันทึกมันในชื่อว่า app.js และมันก็พร้อมใช้งาน

app.js
const express = require('express');
const https = require('https');
const fs = require('fs');

const app = express();
const port = 3000;

const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem'),
};

https.createServer(options, app).listen(port, () => {
    console.log(`Listening at https://localhost:${port}`);
});

app.get('/', (req, res) => {
    res.send('Hello World!');
});

จากนั้นรันโปรแกรมด้วยคำสั่งต่อไปนี้ นี่เป็นการเปิดใช้งานเว็บเซิฟเวอร์เพื่อทำให้เว็บไซต์สามารถเข้าใช้งานได้

node app.js

และลองเข้าใช้งานเว็บไซต์ผ่านที่อยู่ https://localhost:3000/ จะเห็นว่าเราสามารถเข้าผ่าน https ได้แล้ว แต่สังเกตว่าในหน้าเว็บเบราว์เซอร์จะแสดงเครื่องหมายเตือนว่าไม่ปลอดภัย นั่นเป็นเพราะว่าเราใช้ Certificate ที่สร้างขึ้นเองเลยเป็นเช่นนั้น แต่นี่ไม่เป็นไรเนื่องจากเราใช้งานมันในเครื่องของเราเอง

การสร้างเว็บไซต์ https ด้วย Node.js

นี่เป็นเวอร์ชันหนึ่งที่ใช้ Node.js เพียงอย่างเดียวเพื่อสร้างเว็บไซต์ ผลลัพธ์จะเหมือนกับตัวอย่างก่อนหน้า

app_v2.js
const https = require('https');
const fs = require('fs');

const port = 3000;
const options = {
    key: fs.readFileSync('key.pem'),
    cert: fs.readFileSync('cert.pem'),
};

const server = https.createServer(options, (req, res) => {
    res.statusCode = 200;
    res.end('Hello World!');
});

server.listen(port, () => {
    console.log(`Listening at https://localhost:${port}`);
});

จากนั้นรันโปรแกรมด้วยคำสั่งต่อไปนี้ และเข้าถึงเว็บไซต์ผ่าน https://localhost:3000/ เช่นเดิม

node app_v2.js

ในการทำงานจริงเมื่อคุณต้องการเผยแพร่เว็บไซต์สู่สาธารณะ คุณต้องให้ผู้ออกใบรับรองที่น่าเชื่อถิือหรือ Certificate authority สร้าง Certificate ให้ โดยปกติแล้วการออก Certificate ที่น่าเชื่อถือจะมีค่าใช้จ่ายที่ค่อนข้างสูง อย่างไรก็ตาม มีองค์กรไม่แสดงหาผลกำไรอย่าง Let's Encrypt ที่ให้เราสามารถสร้าง Certificate ที่น่าเชื่อถือได้ฟรี

ในบทเรียนนี้ คุณได้เรียนรู้วิธีการสร้าง Self-signed certificate เพื่อใช้ทำให้เว็บไซต์สามารถเข้าถึงผ่าน https ได้บน Node.js และ Express.js นี่มีประโยชน์เมื่อคุณต้องการรันเว็บไซต์เป็นแบบ https ในขณะที่กำลังพัฒนาเว็บไซต์ของคุณอยู่ ดังนั้นเราสามารถสร้าง Self-signed certificate เพื่อใช้งานเองได้เลย

บทความนี้เป็นประโยชน์หรือไม่?Yes·No