Giới thiệu về HTTPS trong Node.js Express
HTTPS (Bảo mật giao thức truyền siêu văn bản) là một giao thức thiết yếu để bảo mật dữ liệu truyền giữa máy khách và máy chủ trong các ứng dụng web. Nó đảm bảo rằng dữ liệu trao đổi được mã hóa và không thể bị chặn hoặc giả mạo bởi các bên trái phép. Trong bài viết này, chúng ta sẽ đi sâu tìm hiểu cách thiết lập HTTPS trong ứng dụng Node.js Express, cung cấp một môi trường an toàn và mạnh mẽ cho người dùng của bạn.
điều kiện tiên quyết
Để làm theo hướng dẫn này, bạn nên có:
- Hiểu biết cơ bản về Node.js và Express
- Node.js (phiên bản 10 trở lên) được cài đặt trên hệ thống của bạn
- Trình soạn thảo văn bản như Visual Studio Code, Sublime Text hoặc Atom
Tạo chứng chỉ SSL
Để bật HTTPS, bạn cần có cặp khóa công khai và khóa riêng tư, có trong chứng chỉ SSL. Bạn có thể lấy chứng chỉ từ Tổ chức phát hành chứng chỉ (CA) như Let’s Encrypt hoặc tạo chứng chỉ tự ký cho mục đích phát triển.
Chứng chỉ tự ký
Sử dụng OpenSSL, bạn có thể tạo chứng chỉ tự ký để phát triển cục bộ:
1 2 | openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days <span class="token number">365</span> |
Lệnh này tạo ra hai tệp:
key.pem
: Khóa riêngcert.pem
: Chứng chỉ công cộng
Lưu ý : Không nên sử dụng chứng chỉ tự ký trong môi trường sản xuất vì chúng sẽ kích hoạt cảnh báo bảo mật của trình duyệt. Thay vào đó, hãy sử dụng CA đáng tin cậy cho chứng chỉ sản xuất.
Định cấu hình Express để sử dụng HTTPS
Giờ bạn đã có chứng chỉ SSL, hãy định cấu hình ứng dụng Node.js Express để sử dụng HTTPS.
1. Tạo một ứng dụng Express mới
Đầu tiên, tạo một thư mục mới cho dự án của bạn và điều hướng vào đó:
1 2 3 | <span class="token function">mkdir</span> nodejs-express-https <span class="token builtin class-name">cd</span> nodejs-express-https |
Khởi tạo dự án với các cài đặt mặc định:
1 2 | <span class="token function">npm</span> init -y |
Cài đặt nhanh:
1 2 | <span class="token function">npm</span> <span class="token function">install</span> express |
2. Thiết lập Máy chủ Express
Tạo một tệp mới có tên app.js trong thư mục dự án và thêm đoạn mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> port <span class="token operator">=</span> <span class="token number">3000</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'Hello World!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> port <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Example app listening at http://localhost:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> port <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Mã này thiết lập một máy chủ Express cơ bản lắng nghe trên cổng 3000 và phản hồi bằng “Xin chào thế giới!” khi được truy cập thông qua URL gốc.
3. Định cấu hình HTTPS
Để định cấu hình HTTPS, bạn cần nhập mô-đun https
và sử dụng nó để tạo một máy chủ an toàn. Cập nhật app.js
bằng mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token keyword">const</span> fs <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'fs'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> https <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'https'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> port <span class="token operator">=</span> <span class="token number">3000</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'Hello World!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Read the SSL certificate files</span> <span class="token keyword">const</span> privateKey <span class="token operator">=</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'key.pem'</span> <span class="token punctuation">,</span> <span class="token string">'utf8'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> certificate <span class="token operator">=</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'cert.pem'</span> <span class="token punctuation">,</span> <span class="token string">'utf8'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Create a credentials object</span> <span class="token keyword">const</span> credentials <span class="token operator">=</span> <span class="token punctuation">{</span> key <span class="token operator">:</span> privateKey <span class="token punctuation">,</span> cert <span class="token operator">:</span> certificate <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Create an HTTPS service with the Express app and the credentials</span> <span class="token keyword">const</span> httpsServer <span class="token operator">=</span> https <span class="token punctuation">.</span> <span class="token function">createServer</span> <span class="token punctuation">(</span> credentials <span class="token punctuation">,</span> app <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Start the HTTPS server</span> httpsServer <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> port <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Example app listening at https://localhost:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> port <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Mã này nhập mô-đun fs
và https
, đọc tệp chứng chỉ SSL, tạo đối tượng thông tin đăng nhập và khởi động máy chủ HTTPS với ứng dụng Express và thông tin đăng nhập.
Bây giờ, ứng dụng Node.js Express của bạn đã được định cấu hình để sử dụng HTTPS. Khi bạn khởi động ứng dụng, nó sẽ lắng nghe các kết nối an toàn trên cổng 3000.
4. Kiểm tra Máy chủ HTTPS
Để kiểm tra máy chủ HTTPS của bạn, hãy chạy lệnh sau:
1 2 | node app.js |
Bạn sẽ thấy đầu ra sau:
1 2 | Example app listening at https://localhost:3000 |
Mở trình duyệt web của bạn và điều hướng đến https://localhost:3000 . Bạn có thể gặp cảnh báo bảo mật do chứng chỉ tự ký. Tiếp tục thận trọng và bạn sẽ thấy thông báo “Xin chào thế giới!” tin nhắn hiển thị.
Chuyển hướng lưu lượng truy cập HTTP sang HTTPS (Tùy chọn)
Nếu bạn muốn chuyển hướng tất cả lưu lượng HTTP sang HTTPS, bạn có thể tạo một máy chủ HTTP bổ sung để chuyển tiếp các yêu cầu đến máy chủ HTTPS. Cập nhật app.js bằng mã sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | <span class="token keyword">const</span> http <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'http'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> fs <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'fs'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> https <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'https'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> express <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'express'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> app <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> httpPort <span class="token operator">=</span> <span class="token number">3001</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> httpsPort <span class="token operator">=</span> <span class="token number">3000</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'Hello World!'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Read the SSL certificate files</span> <span class="token keyword">const</span> privateKey <span class="token operator">=</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'key.pem'</span> <span class="token punctuation">,</span> <span class="token string">'utf8'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> certificate <span class="token operator">=</span> fs <span class="token punctuation">.</span> <span class="token function">readFileSync</span> <span class="token punctuation">(</span> <span class="token string">'cert.pem'</span> <span class="token punctuation">,</span> <span class="token string">'utf8'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Create a credentials object</span> <span class="token keyword">const</span> credentials <span class="token operator">=</span> <span class="token punctuation">{</span> key <span class="token operator">:</span> privateKey <span class="token punctuation">,</span> cert <span class="token operator">:</span> certificate <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// Create an HTTPS service with the Express app and the credentials</span> <span class="token keyword">const</span> httpsServer <span class="token operator">=</span> https <span class="token punctuation">.</span> <span class="token function">createServer</span> <span class="token punctuation">(</span> credentials <span class="token punctuation">,</span> app <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Start the HTTPS server</span> httpsServer <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> httpsPort <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">Example app listening at https://localhost:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> httpsPort <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Create an HTTP server that redirects to the HTTPS server</span> <span class="token keyword">const</span> httpApp <span class="token operator">=</span> <span class="token function">express</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> httpApp <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">https://</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> req <span class="token punctuation">.</span> headers <span class="token punctuation">.</span> host <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> req <span class="token punctuation">.</span> url <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> httpServer <span class="token operator">=</span> http <span class="token punctuation">.</span> <span class="token function">createServer</span> <span class="token punctuation">(</span> httpApp <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Start the HTTP server</span> httpServer <span class="token punctuation">.</span> <span class="token function">listen</span> <span class="token punctuation">(</span> httpPort <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token template-string"><span class="token template-punctuation string">`</span> <span class="token string">HTTP server redirecting to HTTPS at http://localhost:</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> httpPort <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token template-punctuation string">`</span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Mã này nhập mô-đun http
, tạo máy chủ HTTP chuyển hướng đến máy chủ HTTPS và lắng nghe các kết nối trên cổng 3001. Giờ đây, khi người dùng truy cập ứng dụng của bạn qua HTTP, họ sẽ được chuyển hướng đến phiên bản HTTPS.
Phần kết luận
Trong bài viết này, chúng ta đã khám phá tầm quan trọng của việc bảo mật dữ liệu khi truyền bằng HTTPS trong ứng dụng Node.js Express. Chúng tôi đã đề cập đến việc tạo chứng chỉ SSL, định cấu hình máy chủ Express để sử dụng HTTPS và tùy chọn chuyển hướng lưu lượng HTTP sang HTTPS. Việc triển khai HTTPS trong các ứng dụng Express của bạn là rất quan trọng để bảo vệ dữ liệu người dùng và cung cấp trải nghiệm duyệt web an toàn.
Và cuối cùng
Như mọi khi, tôi hy vọng bạn thích bài viết này và có một cái gì đó mới. Xin cảm ơn và hẹn gặp lại các bạn trong những bài viết tiếp theo!
Nếu các bạn thích bài viết này thì hãy cho mình 1 like và subscribe để ủng hộ mình nhé. Cảm ơn.