如何在 Node.js 中开启 HTTPS 服务器?

介绍如何在 Node.js 中配置和启动一个 HTTPS 服务器。

Node.js 简单 HTTPS 服务器 安全

要在 Node.js 中开启 HTTPS 服务器,主要方法包括使用内置模块、第三方库或其他工具。下面从面试角度提供完整实现步䠀。

一、使用内置 https 模块(推荐做法)

这种方式直接利用 Node.js 的核心功能。

  1. 生成自签名密钥和证书 使用 OpenSSL 工具创建私钥和证书文件:
    openssl genrsa -out server.key 2048
    openssl req -new -key server.key -out server.csr
    openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
    

    这将生成 server.key(私钥)和 server.crt(证书)文件。

  2. 在 Node.js 脚本中启用 HTTPS 使用 https.createServer() 创建服务器。需传入密钥和证书选项:
    const https = require('https');
    const fs = require('fs');
    
    const options = {
      key: fs.readFileSync('server.key'), // 加载私钥
      cert: fs.readFileSync('server.crt') // 加载证书
    };
    
    const server = https.createServer(options, (req, res) => {
      res.writeHead(200, { 'Content-Type': 'text/html' });
      res.end('<h1>HTTPS Server Running</h1>');
    });
    
    server.listen(443, () => {
      console.log('Server is running on https://localhost:443');
    });
    

    关键点:options对象中包含文件路径,默认为当前目录,可扩展至端口定制。

二、配合 Express 框架

若使用 Express,可以封装内置 HTTPS:

  1. 安装依赖 先安装 Express:
    npm install express
    
  2. 实现步骤 在 app.js 或入口文件中:
    const express = require('express');
    const https = require('https');
    const fs = require('fs');
    
    const app = express();
    app.get('/', (req, res) => {
      res.send('Hello from Express HTTPS server');
    });
    
    const httpsServer = https.createServer(
      {
        key: fs.readFileSync('server.key'),
        cert: fs.readFileSync('server.crt')
      },
      app
    );
    
    httpsServer.listen(443);
    

    这个方法保持路由设置简便,但须确保正确导入 SSL 文件。

三、使用第三方工具快速启动

对本地开发,工具有效简化过程:

  1. http-server 命令行工具
    • 全局安装:npm install http-server -g
    • 启动 HTTPS:http-server -S (自动生成证书) 或 http-server -S -C cert.pem -K key.pem (指定证书)。这会启用浏览器可访问的 HTTPS 服务。
  2. local-ssl-proxy 更简单方案
    • 全局安装:npm install -g local-ssl-proxy
    • 运行:local-ssl-proxy --source 8443 --target 8080 (示例端口映射)。无需手动证书。

四、其他注意事项

  • 证书生效:自签名证书会被浏览器警告,点击忽略,或使用信任机构颁发的证书。
  • 端口选择:系统权限需求导致默认端口443(HTTPS)需要 admin/sudo;改用8443或8000避免。
  • 框架扩展法:如使用 Rejoice,配置在rejoice.server.https选项中。