
Chào các Gen Z tương lai của thế giới lập trình! Anh là Creyt đây, và hôm nay chúng ta sẽ cùng nhau khám phá một khái niệm cực kỳ quan trọng, một thứ mà nếu không có nó, website của các em cũng như ngôi nhà không cửa vậy: https.createServer(). Nghe có vẻ khô khan nhưng tin anh đi, nó thú vị hơn các em nghĩ nhiều!
https.createServer() là gì mà "hot" vậy?
Thôi nào, đừng có nhìn cái tên mà hoảng. Tưởng tượng thế này nhé: Ngày xưa, khi các em gửi thư cho crush, các em viết lên một tấm bưu thiếp (postcard) đúng không? Ai cũng có thể đọc được nội dung trên đường đi. Đó chính là HTTP (Hypertext Transfer Protocol) – giao thức truyền tải dữ liệu cơ bản, nhưng không mã hóa. Dữ liệu của các em, từ mật khẩu, thông tin cá nhân, cho đến những dòng code "bí mật" trong API, cứ thế mà "trần truồng" trên mạng.
Thế rồi, một ngày đẹp trời, các em muốn gửi thư tình mà không ai đọc trộm được. Các em cho lá thư vào phong bì, dán kín, rồi còn niêm phong bằng sáp, thậm chí dùng mực tàng hình. Đó chính là HTTPS (Hypertext Transfer Protocol Secure) – phiên bản anh em sinh đôi nhưng "ngầu" hơn, bảo mật hơn của HTTP. Nó sử dụng SSL/TLS để mã hóa toàn bộ dữ liệu trước khi gửi đi.
Và https.createServer() trong Node.js chính là cái "bưu điện bảo mật" đó. Thay vì chỉ mở một cái cổng HTTP thông thường, nó mở một cái cổng HTTPS, nơi mọi thứ đều được mã hóa, bảo vệ nghiêm ngặt. Nhiệm vụ của nó là tạo ra một máy chủ web có khả năng lắng nghe và phản hồi các yêu cầu từ trình duyệt của người dùng một cách an toàn.
Để làm gì ư?
- Bảo vệ dữ liệu: Mật khẩu, số thẻ tín dụng, thông tin cá nhân... tất cả đều được mã hóa. Hacker có bắt được gói tin cũng chỉ thấy một mớ bùng nhùng vô nghĩa.
- Tạo niềm tin: Người dùng nhìn thấy ổ khóa màu xanh lá cây trên trình duyệt là auto tin tưởng. "À, trang này uy tín, bảo mật."
- Tốt cho SEO: Google rất yêu thích các website dùng HTTPS và ưu tiên xếp hạng cao hơn. Muốn website của em lên top không? Dùng HTTPS đi!
- Tuân thủ quy định: Nhiều quy định về bảo mật dữ liệu (như GDPR, PCI DSS) yêu cầu phải sử dụng HTTPS.
Để https.createServer() hoạt động, em cần có một cặp "chìa khóa và ổ khóa" đặc biệt, đó chính là chứng chỉ SSL/TLS (Secure Sockets Layer/Transport Layer Security). Gồm có:
- Private Key (Khóa riêng tư): Giống như chìa khóa nhà của em, phải giữ bí mật tuyệt đối.
- Certificate (Chứng chỉ): Giống như cái ổ khóa có tên em trên đó, ai cũng có thể thấy nhưng chỉ có chìa khóa của em mới mở được.
Code Ví Dụ Minh Họa: "Xây Pháo Đài" Đơn Giản
Đây là lúc chúng ta biến lý thuyết thành hành động. Để chạy được ví dụ này, em cần có một cặp chứng chỉ SSL/TLS. Đối với môi trường phát triển (dev), em có thể tự tạo chứng chỉ tự ký (self-signed certificate) cho nhanh.
Bước 1: Tạo chứng chỉ tự ký (chỉ dùng cho dev) Mở Terminal/CMD và chạy lệnh sau (cần cài OpenSSL):
openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out csr.pem
openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem
Các em cứ điền thông tin lung tung cũng được vì đây là chứng chỉ tự ký mà. Sau khi chạy xong, các em sẽ có 3 file: key.pem (private key), csr.pem (certificate signing request - không cần dùng trực tiếp trong code này), và cert.pem (certificate).
Bước 2: Viết code Node.js
Tạo file server.js và thêm nội dung sau:
const https = require('https'); // Import module HTTPS
const fs = require('fs'); // Import module File System để đọc file chứng chỉ
// Đọc các file chứng chỉ
const options = {
key: fs.readFileSync('key.pem'), // Đọc private key
cert: fs.readFileSync('cert.pem') // Đọc certificate
};
// Tạo server HTTPS
// options: chứa key và cert
// (req, res): hàm xử lý mỗi khi có request đến
const server = https.createServer(options, (req, res) => {
console.log(`Request nhận được từ: ${req.url}`);
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Chào mừng đến với server HTTPS bảo mật của Creyt!\n');
});
// Lắng nghe trên cổng 443 (cổng mặc định cho HTTPS)
const PORT = 443;
server.listen(PORT, () => {
console.log(`Server HTTPS đang chạy tại https://localhost:${PORT}`);
console.log('Lưu ý: Vì đây là chứng chỉ tự ký, trình duyệt có thể báo lỗi bảo mật. Cứ chọn "Proceed anyway" nhé!');
});
// Xử lý lỗi nếu có
server.on('error', (err) => {
if (err.code === 'EACCES') {
console.error(`Cổng ${PORT} yêu cầu quyền truy cập đặc biệt. Hãy thử chạy với 'sudo' (Linux/macOS) hoặc quyền Administrator (Windows)`);
} else {
console.error('Lỗi server:', err);
}
});
Giải thích nhanh:
require('https'): Gọi "người gác cổng" HTTPS ra làm việc.require('fs'): Dùng để đọc các filekey.pemvàcert.pem.fs.readFileSync(): Đọc nội dung file chứng chỉ. Quan trọng là phải đọc đồng bộ để server có đủ thông tin trước khi khởi động.https.createServer(options, (req, res) => { ... }): Đây chính là trái tim của chúng ta!options: Một object chứakeyvàcertđã đọc từ file. Đây là thông tin để server "chứng minh thư" của mình.(req, res) => { ... }: Cái này quen rồi đúng không? Là hàm xử lý khi có ai đó gửi yêu cầu đến server của em.
server.listen(PORT, callback): Bắt đầu lắng nghe các yêu cầu đến trên cổngPORT. Mặc định của HTTPS là 443.
Để chạy:
- Đảm bảo các file
key.pemvàcert.pemnằm cùng thư mục vớiserver.js. - Mở Terminal/CMD, di chuyển đến thư mục đó.
- Chạy lệnh:
node server.js - Mở trình duyệt và truy cập
https://localhost:443(hoặc chỉhttps://localhost). Trình duyệt sẽ báo lỗi bảo mật vì đây là chứng chỉ tự ký, cứ bỏ qua và tiếp tục nhé.

Mẹo Vặt "Thực Chiến" Từ Creyt
- Luôn dùng HTTPS ở Production: Đừng bao giờ, ANH NHẮC LẠI LÀ ĐỪNG BAO GIỜ, chạy một ứng dụng web thật sự mà không có HTTPS. Khác nào mời hacker vào nhà uống trà.
- Quản lý chứng chỉ như vàng: File
key.pemlà private key, nó là chìa khóa vạn năng. Tuyệt đối không đẩy lên Git, không chia sẻ lung tung. Nên dùng biến môi trường (environment variables) hoặc các dịch vụ quản lý bí mật (secret management services) như AWS Secrets Manager, HashiCorp Vault. - Tự động hóa gia hạn chứng chỉ: Chứng chỉ SSL/TLS có thời hạn (thường là 90 ngày với Let's Encrypt). Đừng để quên mà nó hết hạn, website của em sẽ sập và người dùng sẽ hoảng loạn. Hãy dùng các công cụ như Certbot của Let's Encrypt để tự động gia hạn.
- Redirect HTTP sang HTTPS: Đảm bảo tất cả các yêu cầu HTTP đều được chuyển hướng (redirect) sang HTTPS. Người dùng có gõ
http://thì vẫn phải được đưa đếnhttps://.// Thêm vào server.js để redirect HTTP sang HTTPS const http = require('http'); http.createServer((req, res) => { res.writeHead(301, { "Location": "https://" + req.headers['host'] + req.url }); res.end(); }).listen(80, () => { console.log('Server HTTP đang chạy và redirect sang HTTPS tại http://localhost:80'); }); - Chọn Cipher Suite mạnh mẽ: Cái này hơi nâng cao, nhưng hiểu nôm na là các thuật toán mã hóa được sử dụng. Hãy cấu hình để server của em chỉ chấp nhận những thuật toán mã hóa mạnh, hiện đại.
// Ví dụ cấu hình cipher suite (trong options của https.createServer) const options = { key: fs.readFileSync('key.pem'), cert: fs.readFileSync('cert.pem'), ciphers: [ "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256", "TLS_AES_128_GCM_SHA256", "ECDHE-RSA-AES256-GCM-SHA384", "ECDHE-RSA-AES128-GCM-SHA256" ].join(':'), honorCipherOrder: true, minVersion: 'TLSv1.2' // Đảm bảo chỉ dùng các phiên bản TLS mới nhất };
Ứng Dụng Thực Tế: Ai cũng dùng!
Hầu hết mọi website, ứng dụng mà các em dùng hàng ngày đều chạy trên HTTPS, và đằng sau đó có thể là một server Node.js sử dụng https.createServer() (hoặc một proxy server như Nginx/Apache xử lý HTTPS và chuyển tiếp sang Node.js qua HTTP).
- Các trang thương mại điện tử: Shopee, Lazada, Tiki, Amazon... Tưởng tượng thông tin thẻ tín dụng của em mà không mã hóa thì sao?
- Ngân hàng trực tuyến: Vietcombank, Techcombank... Bảo mật là tối thượng.
- Mạng xã hội: Facebook, Instagram, TikTok... Mật khẩu, tin nhắn riêng tư, hình ảnh... không ai muốn bị lộ.
- Các API backend: Nếu em xây dựng một API cho ứng dụng di động hoặc frontend của mình, đặc biệt là các API liên quan đến xác thực, thanh toán, hoặc dữ liệu nhạy cảm, thì HTTPS là bắt buộc.
Thử Nghiệm và Khi Nào Nên Dùng?
Thử nghiệm: Như ví dụ trên, các em hoàn toàn có thể tự tạo một server HTTPS cục bộ với chứng chỉ tự ký. Việc này giúp các em hiểu rõ cách nó hoạt động, cách trình duyệt phản ứng với các chứng chỉ khác nhau. Đây là bước đệm quan trọng trước khi triển khai thực tế.
Khi nào nên dùng https.createServer()?
Câu trả lời đơn giản là: GẦN NHƯ LUÔN LUÔN!
- Ứng dụng web công khai: Bất kỳ website nào mà người dùng truy cập, dù là blog cá nhân, portfolio hay một startup tỷ đô.
- API backend: Đặc biệt là API cho các ứng dụng di động, SPA (Single Page Application) nơi frontend và backend giao tiếp qua mạng.
- Bất kỳ dịch vụ nào xử lý dữ liệu nhạy cảm: Thông tin cá nhân, tài chính, y tế, bí mật kinh doanh...
- Khi muốn cải thiện SEO và uy tín: Như đã nói, Google ưu tiên HTTPS.
Khi nào có thể không dùng trực tiếp (nhưng vẫn dùng HTTPS)?
Đôi khi, các em sẽ không dùng https.createServer() trực tiếp trong code Node.js của mình. Thay vào đó, em sẽ chạy server Node.js của mình qua HTTP trên một cổng nội bộ (ví dụ: http://localhost:3000), và đặt một Reverse Proxy như Nginx hoặc Apache ở phía trước. Cái proxy này sẽ chịu trách nhiệm xử lý HTTPS (tức là nó sẽ dùng chứng chỉ SSL/TLS và https.createServer() của riêng nó) và chuyển tiếp các yêu cầu đã được giải mã sang server Node.js của em.
Ưu điểm của cách này:
- Nginx/Apache rất tối ưu cho việc xử lý kết nối SSL/TLS và phục vụ file tĩnh.
- Dễ dàng quản lý nhiều ứng dụng trên cùng một server.
- Node.js của em chỉ tập trung vào logic nghiệp vụ mà không phải lo lắng về việc quản lý chứng chỉ, cipher, v.v.
Dù dùng cách nào, thì nguyên tắc vàng vẫn là: Dữ liệu trên mạng phải được bảo vệ!
Vậy đó, các em đã thấy sức mạnh và sự cần thiết của https.createServer() rồi chứ? Hãy biến kiến thức này thành vũ khí bí mật của mình để xây dựng những ứng dụng không chỉ mạnh mẽ mà còn an toàn và đáng tin cậy! Hẹn gặp lại trong bài học tiếp theo nhé!
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!