Node.js HTTPS:建立加密的安全伺服器連線
在現代網路環境中,HTTPS(加密的 HTTP)已成為基礎門檻。無論是為了保護使用者資料,還是為了滿足現代瀏覽器的安全性要求,掌握 Node.js 的 https 模組與 TLS (Transport Layer Security) 協定是後端工程師的必修課。
核心準備:SSL/TLS 憑證
要在 Node.js 中啟動 HTTPS 伺服器,你需要兩種核心檔案:
- 私鑰 (Private Key):通常為
.key檔案。這是敏感資料,不可外流。 - 認證憑證 (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 的 fetch 或 https.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 策略:
- Node.js 只跑在普通的 HTTP (如 Port 3000) 上。
- 前端架設一層 Nginx、Caddy 或 Cloudflare。
- 由這層「代理」負責處理 SSL 的加解密,並將乾淨的 HTTP 轉發給內部的 Node.js。
這能大幅釋放 Node.js 的 CPU 負擔,並簡化憑證更新流程。
總結
- 安全性 是後端開發的底線,HTTPS 是一切的基礎。
- 了解如何讀取
.key與.crt檔案。 - 區分開發用自簽憑證與生產用權威憑證的差異。