Node.js HTTPS:建立加密的安全伺服器連線

在現代網路環境中,HTTPS(加密的 HTTP)已成為基礎門檻。無論是為了保護使用者資料,還是為了滿足現代瀏覽器的安全性要求,掌握 Node.js 的 https 模組與 TLS (Transport Layer Security) 協定是後端工程師的必修課。

核心準備:SSL/TLS 憑證

要在 Node.js 中啟動 HTTPS 伺服器,你需要兩種核心檔案:

  1. 私鑰 (Private Key):通常為 .key 檔案。這是敏感資料,不可外流。
  2. 認證憑證 (Certificate):通常為 .crt.pem 檔案。

[!TIP]

  • 正式環境:請向 Let's Encrypt 等機構申請免費的權威憑證。
  • 開發環境:可以使用 mkcert (推薦) 或 openssl 指令產生測試用的「自簽憑證」。

實戰:建立 HTTPS 伺服器

const https = require('https');
const fs = require('fs');

// 1. 讀取並配置憑證
const options = {
  key: fs.readFileSync('server.key'),
  cert: fs.readFileSync('server.crt'),
};

// 2. 建立加密伺服器
const server = https.createServer(options, (req, res) => {
  res.writeHead(200);
  res.end('<h1>這是一個經過 SSL 加密的傳輸連線</h1>');
});

server.listen(443, () => {
  console.log('HTTPS Server is running on port 443');
});

HTTPS Client:解決自簽憑證報錯

當你用 Node.js 的 fetchhttps.get 請求一個使用「自簽憑證」的測試伺服器時,會遇到 DEPTH_ZERO_SELF_SIGNED_CERT 錯誤,這是因為 Node.js 無法驗證該來源的真實性。

開發環境應急方案 (安全警示)

你可以設定 rejectUnauthorized: false 來跳過驗證。

嚴正警告:此設定會讓通訊容易受到中間人攻擊 (MITM),嚴禁在生產環境中使用。
const https = require('https');

// 建立一個不檢查憑證合法性的 Agent
const agent = new https.Agent({
  rejectUnauthorized: false,
});

https.get('https://localhost:443', { agent }, (res) => {
  // 處理回應...
});

專業部署建議:反向代理 (Reverse Proxy)

雖然 Node.js 內建 HTTPS 功能,但在業界大規模生產環境中,我們通常採用 SSL Termination 策略:

  1. Node.js 只跑在普通的 HTTP (如 Port 3000) 上。
  2. 前端架設一層 NginxCaddyCloudflare
  3. 由這層「代理」負責處理 SSL 的加解密,並將乾淨的 HTTP 轉發給內部的 Node.js。

這能大幅釋放 Node.js 的 CPU 負擔,並簡化憑證更新流程。

總結

  1. 安全性 是後端開發的底線,HTTPS 是一切的基礎。
  2. 了解如何讀取 .key.crt 檔案。
  3. 區分開發用自簽憑證與生產用權威憑證的差異。