Hướng dẫn cách cài đặt chứng chỉ SSL trên Node.js
Lời nói đầu
Sau khi chứng chỉ SSL được cấp, chứng chỉ SSL sẽ được triển khai trên máy chủ web để kích hoạt kết nối HTTPS. Sau khi cấp, Tổ chức phát hành chứng chỉ (Comodo / Sectigo) sẽ gửi các tệp chứng chỉ qua email; những tệp này cũng sẽ có sẵn để tải xuống từ tài khoản Namecheap của bạn như được mô tả ở đây .
Bài viết này sẽ đề cập đến việc triển khai chứng chỉ cho Node.js và Express . Bạn có thể chuyển đến các phần thích hợp từ Mục lục bên dưới.
Hiện tại, phiên bản LTS của Node.js là 10.15.0 và phiên bản mới nhất của Express là 4.16.4. Các phiên bản này sẽ được sử dụng và tham khảo trong suốt hướng dẫn này.
Lưu ý : Hướng dẫn này cũng giả định hiểu biết cơ bản về JavaScript vì Node.js là môi trường thời gian chạy JavaScript, cũng như các khái niệm cơ bản về Node.js và / hoặc Express.
Contents
Điều kiện tiên quyết
Cài đặt chứng chỉ SSL yêu cầu tệp chứng chỉ do Tổ chức phát hành chứng chỉ cung cấp, cũng như khóa cá nhân phù hợp cho chứng chỉ SSL.
Các tệp này phải được tải lên máy chủ của bạn (hoặc bất kỳ nơi nào đặt ứng dụng Node.js) trước khi tiếp tục các bước tiếp theo:
- Chứng chỉ (thường là tệp .crt).
- Gói / chuỗi CA (thường là tệp .ca-pack).
- Khóa cá nhân (thường là tệp .key).
Khóa cá nhân được tạo trước khi kích hoạt chứng chỉ, thường cùng lúc với Yêu cầu ký chứng chỉ (CSR). Ngay cả khi bạn có khóa cá nhân, bạn nên kiểm tra xem nó có phải là khóa chính xác hay không bằng cách khớp nó với chứng chỉ SSL của bạn trong công cụ này .
Xin lưu ý : Trong khi các tệp có thể được đặt vào bất kỳ thư mục nào, hãy đảm bảo rằng thư mục chứa khóa cá nhân không được công khai. Khóa cá nhân có nghĩa là được lưu trữ an toàn trên máy chủ mà không có bất kỳ quyền truy cập công khai nào.
Nếu bạn không chắc chắn nơi tìm khóa cá nhân, chúng tôi khuyên bạn nên xem bài viết này. Trong trường hợp khóa cá nhân bị mất hoặc không có cách nào để lấy lại, bạn luôn có thể phát hành lại chứng chỉ của mình với CSR và cặp khóa mới.
Quan trọng : Khi tải xuống tệp chứng chỉ từ tài khoản Namecheap của bạn, bạn cũng sẽ nhận được tệp .p7b (chứng chỉ PKCS # 7). Tệp này không phải là khóa cá nhân và sẽ không cần thiết để cài đặt.
Nhập tệp chứng chỉ vào ứng dụng của bạn
Các khả năng SSL / TLS của Node.js dựa trên thư viện OpenSSL, vì vậy nó linh hoạt trong cách nó chấp nhận các tệp chứng chỉ SSL. Các tệp có thể được đọc dưới dạng bộ đệm hoặc dưới dạng văn bản (chỉ định mã hóa UTF-8) bằng mô-đun FS (Hệ thống tệp) hoặc có thể được cung cấp đơn giản dưới dạng chuỗi với mã chứng chỉ ở định dạng PEM.
Trong hầu hết các trường hợp, cách đơn giản nhất được ưu tiên là đọc các tệp chứng chỉ SSL từ hệ thống tệp như được hiển thị bên dưới:
const fs = request ( ‘ fs’ );
const cert = fs.readFileSync ( ‘./path/to/the/cert.crt’ ); |
Các đường dẫn đến các tệp này có thể là tương đối hoặc tuyệt đối. Hãy thoải mái sử dụng mô-đun Đường dẫn để tạo các đường dẫn thay vì sử dụng các chuỗi đơn giản.
Dưới đây là một ví dụ thiết lập khi các tệp đang được tải:
Trong ví dụ này, thư mục ssl được tạo riêng cho các tệp liên quan đến SSL và các tệp được đọc từ đó. Các hằng số cert , ca và key giữ các đại diện tương ứng của chứng chỉ SSL, gói CA và các tệp khóa riêng tư.
Quan trọng : Một số chứng chỉ trong một tệp (thường cần cho tệp gói CA) được hỗ trợ từ Node.js phiên bản 5.2.0. Nếu bạn đang sử dụng phiên bản Node.js cũ hơn, bạn sẽ cần cung cấp một loạt các chứng chỉ CA như được hiển thị bên dưới.
Có thể kiểm tra phiên bản Node.js mà bạn đã cài đặt bằng cách chạy nút -v .
Nếu bạn đang sử dụng Node.js 5.2.0 trở lên, bạn có thể bỏ qua phần này và chuyển thẳng đến HTTPS trên Node.js hoặc HTTPS trên Express .
Trong trường hợp bạn đang sử dụng phiên bản Node.js trước 5.2.0, bạn có thể làm theo hướng dẫn bên dưới để chia gói CA thành các chứng chỉ SSL riêng biệt.
Bạn có thể tách tệp .ca-pack theo cách thủ công thành các tệp chứng chỉ riêng biệt bằng cách sử dụng bất kỳ trình soạn thảo văn bản nào và tải chúng vào một mảng. Hoặc, bạn có thể tách tệp .ca-pack trong ứng dụng của mình. Ví dụ về cả hai được cung cấp bên dưới:
Sử dụng nhiều tệp chứng chỉ CA:
const ca = [ fs.readFileSync ( ‘./ssl/CAcert1.crt’ ), fs.readFileSync ( ‘./ssl/CAcert2.crt’ ) ]; |
Nếu bạn tách các tệp theo cách thủ công, hãy đảm bảo cung cấp chúng theo cùng thứ tự trong tệp .ca-pack.
Tách tệp trong ứng dụng:
const caBundle = fs.readFileSync ( ‘./ssl/example.ca-bundle’ , { encoding : ‘utf8’ }); const ca = caBundle.split ( ‘—– HẾT GIẤY CHỨNG NHẬN —– \ r \ n’ ) .map (cert => cert + ‘—– END CERTIFICATE —– \ r \ n ‘ ); // Chúng tôi phải xóa một mục bổ sung hiện có do // một dòng thừa ở cuối tệp. // Điều này có thể cần hoặc không tùy thuộc vào định dạng // của tệp .ca-pack của bạn. capop (); giao diện điều khiển .log (ca); |
Kết quả của việc chạy đoạn mã trên sẽ là một mảng chứng chỉ như hình dưới đây:
HTTPS trên Node.js
Tạo máy chủ HTTPS
Máy chủ HTTPS được tạo bằng phương thức https.createServer () , lấy một đối tượng tùy chọn làm đối số đầu tiên và trình xử lý yêu cầu gọi lại là đối tượng thứ hai. Đối tượng tùy chọn phải chứa các thuộc tính sau:
- cert – chứng chỉ
- ca – gói CA (chuỗi) được cung cấp trong một tệp hoặc dưới dạng một mảng
- chìa khóa – chìa khóa cá nhân
Các tùy chọn bổ sung có thể được thêm vào đối tượng nếu cần.
Xin lưu ý : Nếu bạn có chứng chỉ ở định dạng .pfx (PKCS # 12), bạn có thể sử dụng chứng chỉ đó bằng cách cung cấp đối tượng tùy chọn với thuộc tính pfx chứa tệp pfx và thuộc tính cụm mật khẩu nếu cần.
Như mọi khi, bạn có thể tạo đối tượng trước khi gọi phương thức hoặc bạn có thể chuyển một đối tượng ẩn danh với các thuộc tính bắt buộc, được hiển thị bên dưới:
let options = { cert : cert, // fs.readFileSync (‘./ ssl / example.crt’); ca : ca, // fs.readFileSync (‘./ ssl / example.ca-pack’); key : key // fs.readFileSync (‘./ ssl / example.key’); };// cũng được: https.createServer ({cert, ca, key}, (req, res) => {… const httpsServer = https.createServer (options, (req, res) => { res.statusCode = 200 ; res.setHeader ( ‘Content-Type’ , ‘text / html’ ); res.end ( “<h1> Máy chủ HTTPS đang chạy </h1>” ); }); |
Cuối cùng, mã máy chủ soạn sẵn sẽ trông giống như sau:
Ở đây chúng tôi nhập các tệp chứng chỉ vào một đối tượng trên dòng 7-11, sau đó chuyển đối tượng này đến phương thức createServer trên dòng 13 tạo máy chủ HTTPS và cuối cùng gọi phương thức nghe () trên dòng 19 để khởi động máy chủ.
Đảm bảo khởi động lại ứng dụng Node.js của bạn nếu ứng dụng đã chạy để áp dụng các thay đổi. Để khởi động ứng dụng, bạn chỉ cần chạy nút.jstrong thư mục có ứng dụng của bạn, ở đâu.jslà tệp khởi động ứng dụng của bạn.
Điều này hoàn thành thiết lập! Bạn có thể sử dụng công cụ sau để kiểm tra cài đặt chứng chỉ SSL bằng cách nhập tên máy chủ và cổng tương ứng mà bạn đang sử dụng: https://decoder.link
Chuyển hướng sang HTTPS
Để chuyển hướng các yêu cầu HTTP đến HTTPS, bạn cũng sẽ cần thiết lập một máy chủ HTTP với mô-đun HTTP .
Về bản chất, việc chuyển hướng một yêu cầu HTTP đến một URL khác yêu cầu hai thứ: mã phản hồi tương ứng (301 hoặc 302) và tiêu đề HTTP “Vị trí” với URL sẽ được sử dụng thay thế.
Dưới đây, bạn có thể tìm thấy một ví dụ về cách một máy chủ HTTP như vậy có thể được thiết lập:
const http = request ( ‘http’ ); const hostname = ‘exampledomain.com’ ; const httpServer = http.createServer ((req, res) => { res.statusCode = 301 ; res.setHeader ( ‘Location’ , `https: // $ { hostname } $ { req. url} ` ); res.end (); // đảm bảo gọi send () hoặc end () để gửi phản hồi }); httpServer.listen ( 80 ); |
Trong ví dụ trên, chúng tôi cũng chuyển URL được yêu cầu từ yêu cầu . url .
Nếu trước đây bạn đang phân phát tất cả nội dung qua HTTP và muốn chuyển sang HTTPS và thiết lập chuyển hướng, thì cách dễ nhất là chỉ cần thay đổi máy chủ HTTP của bạn thành máy chủ HTTPS và tạo một máy chủ HTTP bổ sung sẽ chuyển hướng các yêu cầu.
Dưới đây, bạn có thể thấy một yêu cầu được gửi đến một máy chủ HTTP như vậy với một URL tùy chỉnh:
Và sau đó được chuyển chính xác đến máy chủ HTTPS:
HTTPS trên Express
Thiết lập ứng dụng HTTPS với Express
Sử dụng HTTPS với Express yêu cầu tạo máy chủ HTTPS với mô-đun HTTPS từ Node.js. Ứng dụng Express của bạn phải được chuyển dưới dạng tham số cho phương thức https.createServer () :
const https = request ( ‘https’ ); const express = demand ( ‘express’ );// const httpsOptions = {cert, ca, key}; const app = express (); // Mã ứng dụng của bạn tại đây httpsServer.listen ( 443 , ‘exampledomain.com’ ); |
Tham số httpsOptions là một đối tượng giống với đối tượng được sử dụng trong phần này của hướng dẫn: Tạo máy chủ HTTPS .
Dưới đây là ví dụ về mã đầy đủ để tạo ứng dụng HTTPS Express:
Tại thời điểm này, bạn sẽ có một ứng dụng Express có thể truy cập thông qua HTTPS. Lưu ý rằng ứng dụng ví dụ nói trên sẽ chỉ lắng nghe các yêu cầu HTTPS trên cổng được chỉ định. Nếu bạn cũng cần ứng dụng của mình lắng nghe các yêu cầu HTTP, bạn sẽ cần thiết lập một máy chủ HTTP theo cách tương tự bằng cách sử dụng http.createServer () từ mô-đun HTTP .
Đảm bảo khởi động lại ứng dụng của bạn nếu ứng dụng đã chạy để áp dụng các thay đổi. Để khởi động lại ứng dụng, bạn chỉ cần chạy nút.jstrong thư mục với ứng dụng của bạn.
Công cụ này có thể được sử dụng để kiểm tra cài đặt chứng chỉ SSL: https://decoder.link
Chuyển hướng sang HTTPS với Express
Để chuyển hướng bất kỳ yêu cầu HTTP nào đến HTTPS, bạn cũng sẽ cần có một máy chủ HTTP đang chạy có thể lắng nghe các yêu cầu HTTP. Máy chủ phải được tạo bằng mô-đun HTTP và chuyển ứng dụng Express của bạn làm tham số giống như cách ứng dụng được chuyển cho máy chủ HTTPS.
Để tạo chuyển hướng đến HTTPS, bạn có thể thiết lập chức năng phần mềm trung gian để kiểm tra xem yêu cầu có được thực hiện qua HTTP hay không và chuyển hướng đến HTTPS nếu có. Dưới đây là một ví dụ về phần mềm trung gian như vậy bằng cách sử dụng phương thức redirect () được tích hợp sẵn từ Express:
app.use ((req, res, next) => { if (req.protocol === ‘http’ ) { res.redirect ( 301 , `https: // $ { req. headers . host} $ { req. url} ` ); } next (); }); |
Dưới đây là ví dụ về mã ứng dụng Express đầy đủ sử dụng HTTPS và chuyển hướng tất cả các yêu cầu HTTP đến HTTPS:
Trong đoạn mã trên, chúng tôi thiết lập ứng dụng Express của mình trên dòng 16, sau đó tạo máy chủ HTTP và HTTPS trên dòng 17 và 18. Dòng 20-25 tạo phần mềm trung gian chuyển hướng các yêu cầu HTTP đến HTTPS. Cuối cùng, làm ví dụ, chúng tôi thiết lập một số mã máy chủ trên các dòng 30-35 và khởi động các máy chủ HTTP và HTTPS bằng cách gọi các phương thức nghe () của chúng trên các dòng 37 và 38.
Dưới đây, bạn có thể thấy ảnh chụp màn hình minh họa các yêu cầu HTTP cho cả tệp tĩnh và URL tùy chỉnh, được chuyển hướng chính xác.
Tệp tĩnh:
URL tùy chỉnh:
Xin lưu ý : Nếu Node.js được cài đặt dưới dạng môi trường ảo trên máy chủ lưu trữ chia sẻ Namecheap – thì không thể cài đặt chứng chỉ SSL trên đó, thay vào đó, chứng chỉ có thể được cài đặt dễ dàng thông qua cPanel .