Files

346 lines
14 KiB
Markdown
Raw Permalink Normal View History

2026-05-16 13:24:02 +08:00
# SSL/TLS 配置
<cite>
**本文引用的文件**
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/log.ts](file://src/log.ts)
- [src/websocket.ts](file://src/websocket.ts)
- [package.json](file://package.json)
- [run.bat](file://run.bat)
- [server.cert](file://server.cert)
- [server.key](file://server.key)
- [tsconfig.json](file://tsconfig.json)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件围绕当前代码库中的 HTTPS 与证书使用现状,提供一份面向实际部署的 SSL/TLS 配置参考。重点涵盖以下方面:
- 当前 HTTPS 启用方式与证书加载机制
- 证书文件位置与格式要求
- HTTPS 服务器启动参数与运行脚本
- 与证书相关的配置项与环境变量
- 为后续扩展 ACME 自动续期、HSTS、OCSP Stapling 等安全加固提供落地建议
说明:当前仓库已内置示例证书与密钥文件,用于本地演示 HTTPS但未包含 Let's Encrypt 或商业证书的自动化流程、ACME 续期脚本等。本文将基于现有实现,给出可操作的扩展路径与最佳实践。
## 项目结构
与 SSL/TLS 相关的关键文件与职责如下:
- 证书与密钥server.key、server.cert
- 应用入口与 HTTPS 启动src/index.ts
- Express 服务器创建与静态资源src/server.ts
- 运行脚本与命令行参数package.json、run.bat
- 日志与选项定义src/log.ts、src/class/options.ts
- WebSocket 信令服务src/websocket.ts
- TypeScript 编译配置tsconfig.json
```mermaid
graph TB
A["应用入口<br/>src/index.ts"] --> B["HTTPS 服务器创建<br/>读取 server.key / server.cert"]
A --> C["Express 应用创建<br/>src/server.ts"]
C --> D["静态资源与路由<br/>客户端页面与 API"]
A --> E["WebSocket 信令服务<br/>src/websocket.ts"]
F["运行脚本<br/>package.json"] --> A
G["启动批处理<br/>run.bat"] --> A
H["证书与密钥<br/>server.key / server.cert"] --> B
```
图表来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
- [server.key](file://server.key)
- [server.cert](file://server.cert)
章节来源
- [src/index.ts:13-106](file://src/index.ts#L13-L106)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
- [server.key](file://server.key)
- [server.cert](file://server.cert)
## 核心组件
- HTTPS 启用与证书加载
- 在应用入口中,当启用 HTTPS 时,通过读取 server.key 与 server.cert 文件创建 HTTPS 服务器,并监听指定端口。
- 证书与私钥文件路径可通过命令行参数覆盖,默认值指向项目根目录下的 server.key 与 server.cert。
- Express 应用与静态资源
- Express 应用负责提供前端页面、API 接口与静态资源HTTPS 仅影响传输层安全,不影响应用逻辑。
- 运行脚本与参数
- package.json 中的 start 脚本默认以 HTTPS 启动,并传入 -s、-p、-k、-c 等参数。
- run.bat 提供 Windows 环境下的构建与启动流程示例。
- 日志与选项
- 日志系统支持多级别输出,便于排障。
- Options 接口定义了端口、HTTPS 开关、证书与密钥路径、信令类型、日志级别等配置项。
章节来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/index.ts:20-41](file://src/index.ts#L20-L41)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
## 架构总览
下图展示了 HTTPS 启动与请求处理的整体流程,以及证书加载与静态资源服务的关系。
```mermaid
sequenceDiagram
participant CLI as "命令行/脚本"
participant App as "应用入口<br/>src/index.ts"
participant HTTPS as "HTTPS 服务器"
participant Express as "Express 应用<br/>src/server.ts"
participant WS as "WebSocket 信令<br/>src/websocket.ts"
CLI->>App : 传入参数(-s/-p/-k/-c)
App->>App : 解析 Options 并校验
App->>HTTPS : 读取 server.key / server.cert 创建 HTTPS 服务器
HTTPS-->>App : 监听端口并输出访问地址
App->>Express : 初始化 Express 应用
Express-->>App : 提供静态资源与 API
App->>WS : 启动 WebSocket 信令服务
Note over HTTPS,Express : 所有请求均通过 HTTPS 传输
```
图表来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:15-19](file://src/websocket.ts#L15-L19)
章节来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:15-19](file://src/websocket.ts#L15-L19)
## 详细组件分析
### HTTPS 启动与证书加载
- 参数解析与默认值
- HTTPS 开关、端口、证书与密钥路径均可通过命令行参数配置;默认启用 HTTPS。
- 证书与密钥读取
- 使用文件系统读取 server.key 与 server.cert作为 HTTPS 服务器的凭据。
- 启动行为
- 成功启动后输出 https:// 访问地址;若未启用 HTTPS则输出 http://。
```mermaid
flowchart TD
Start(["应用启动"]) --> Parse["解析命令行参数<br/>确定 HTTPS 与证书路径"]
Parse --> Secure{"是否启用 HTTPS"}
Secure --> |是| LoadCert["读取 server.key / server.cert"]
Secure --> |否| HTTPListen["启动 HTTP 服务器"]
LoadCert --> HTTPSListen["启动 HTTPS 服务器并监听端口"]
HTTPSListen --> LogAddr["输出 https:// 访问地址"]
HTTPListen --> LogAddr
LogAddr --> End(["服务就绪"])
```
图表来源
- [src/index.ts:20-41](file://src/index.ts#L20-L41)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
章节来源
- [src/index.ts:20-41](file://src/index.ts#L20-L41)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
### Express 应用与静态资源
- CORS 与日志
- 默认开启跨域与 Morgan 日志记录,日志级别可配置。
- 路由与静态资源
- 提供根路径页面、/signaling 信令路由、静态资源目录等。
- 上传与媒体资源
- 提供头像上传与静态媒体访问路径。
章节来源
- [src/server.ts:18-20](file://src/server.ts#L18-L20)
- [src/server.ts:25-39](file://src/server.ts#L25-L39)
- [src/server.ts:62-86](file://src/server.ts#L62-L86)
### WebSocket 信令服务
- 与 HTTP 服务器共享底层 TCP 连接
- WebSocket 服务器依附于同一 HTTP 服务器实例,因此也受 HTTPS 保护。
- 连接生命周期管理
- 连接建立、消息分发、断开清理等逻辑由处理器模块完成。
章节来源
- [src/websocket.ts:15-19](file://src/websocket.ts#L15-L19)
- [src/websocket.ts:27-38](file://src/websocket.ts#L27-L38)
- [src/websocket.ts:44-114](file://src/websocket.ts#L44-L114)
### 运行脚本与参数
- package.json
- start 脚本默认以 HTTPS 启动,并传入 -s、-p、-k、-c 等参数。
- run.bat
- Windows 环境下先构建再启动,便于本地调试。
章节来源
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
### 证书与密钥文件
- server.key 与 server.cert
- 示例证书与密钥文件位于项目根目录,用于演示 HTTPS 功能。
- 请确保文件权限正确,避免被其他用户读取。
章节来源
- [server.key](file://server.key)
- [server.cert](file://server.cert)
## 依赖关系分析
- 应用入口依赖文件系统读取证书与密钥,依赖 Express 提供 Web 服务,依赖 WebSocket 提供信令通道。
- Express 应用依赖日志模块与配置模块,提供静态资源与 API。
- 运行脚本与批处理文件负责编译与启动流程。
```mermaid
graph LR
Index["src/index.ts"] --> FS["文件系统<br/>读取 server.key / server.cert"]
Index --> Express["Express 应用<br/>src/server.ts"]
Express --> Static["静态资源与路由"]
Index --> WS["WebSocket 信令<br/>src/websocket.ts"]
Run["package.json 脚本"] --> Index
Bat["run.bat"] --> Index
```
图表来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:15-19](file://src/websocket.ts#L15-L19)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
章节来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:15-19](file://src/websocket.ts#L15-L19)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
## 性能考虑
- 证书与密钥读取
- 采用同步读取方式,启动阶段一次性加载,运行时无额外 IO 开销。
- 日志级别
- 可通过日志级别控制输出量,避免在高并发场景下产生过多 I/O。
- 静态资源
- 建议在生产环境中配合反向代理缓存与压缩,提升静态资源访问效率。
章节来源
- [src/index.ts:57-58](file://src/index.ts#L57-L58)
- [src/log.ts:15-24](file://src/log.ts#L15-L24)
## 故障排查指南
- 无法启动 HTTPS 服务器
- 检查 server.key 与 server.cert 是否存在且可读。
- 确认端口未被占用,且进程具备相应权限。
- 访问出现证书错误
- 若使用自签名证书,请在浏览器或客户端信任该证书。
- 确认域名与证书匹配,避免主机名不一致导致的校验失败。
- 日志定位问题
- 使用日志模块提供的不同级别输出,结合 Express 的 Morgan 日志,快速定位请求异常。
章节来源
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/log.ts:30-50](file://src/log.ts#L30-L50)
- [src/server.ts:18-20](file://src/server.ts#L18-L20)
## 结论
当前代码库已具备基本的 HTTPS 启用能力与证书加载机制,适合在开发与演示环境中使用。若需在生产环境长期稳定运行,建议进一步完善以下方面:
- 引入 ACME 自动续期(如 acme.sh实现 Let's Encrypt 免费证书的自动化申请与续期。
- 部署反向代理(如 Nginx/Caddy统一处理 TLS 终止、证书管理与安全头部。
- 配置 HSTS、OCSP Stapling、前向保密等安全策略提升整体安全性与性能。
## 附录
### 证书与密钥文件位置
- server.keyHTTPS 私钥文件
- server.certHTTPS 证书文件
章节来源
- [server.key](file://server.key)
- [server.cert](file://server.cert)
### HTTPS 启动参数与脚本
- 命令行参数
- -s/--secure启用 HTTPS
- -p/--port监听端口
- -k/--keyfile私钥文件路径
- -c/--certfile证书文件路径
- 启动脚本
- package.json 的 start 脚本默认以 HTTPS 启动
- run.bat 提供 Windows 环境下的构建与启动流程
章节来源
- [src/index.ts:20-41](file://src/index.ts#L20-L41)
- [package.json:9-10](file://package.json#L9-L10)
- [run.bat:8](file://run.bat#L8)
### 与证书相关的配置项与环境变量
- Options 接口定义了 secure、port、keyfile、certfile、type、mode、logging 等配置项
- 环境变量映射
- PORT、SECURE、KEYFILE、CERTFILE、TYPE、MODE、LOGGING
章节来源
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [src/index.ts:20-41](file://src/index.ts#L20-L41)
### 证书格式与转换(概念性说明)
- PEM 与 DER
- PEM 是文本格式DER 是二进制格式;两者可互相转换。
- PKCS#12
- 包含私钥与证书链,常用于导入导出。
- OpenSSL 常用命令(概念性说明)
- 证书转 DERopenssl x509 -in server.pem -outform DER -out server.der
- DER 转 PEMopenssl x509 -in server.der -inform DER -out server.pem -outform PEM
- 生成自签名证书openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes
- 导出 PKCS#12openssl pkcs12 -export -out keystore.p12 -inkey key.pem -in cert.pem
说明:本节为通用概念说明,不直接对应具体源码文件。
### Let's Encrypt 与商业证书申请(概念性说明)
- Let's Encrypt
- 使用 acme.sh 等工具自动申请与续期免费证书。
- 商业证书
- 通过 CA 申请,通常包含中间证书链,需按要求配置证书链文件。
- 证书链验证
- 生产环境应提供完整链路,避免中间证书缺失导致校验失败。
说明:本节为通用概念说明,不直接对应具体源码文件。
### HTTPS 服务器配置要点(概念性说明)
- TLS 版本
- 建议禁用过时版本,启用现代 TLS 1.2/1.3。
- 加密套件
- 优先选择支持前向保密的套件,避免弱加密算法。
- 证书链
- 确保证书链完整,避免客户端校验失败。
说明:本节为通用概念说明,不直接对应具体源码文件。
### 证书自动续期方案(概念性说明)
- acme.sh
- 支持自动申请、验证与续期,可配置定时任务。
- 定时任务
- 使用 crontab 或计划任务定期执行续期检查与重启服务。
说明:本节为通用概念说明,不直接对应具体源码文件。
### 安全最佳实践(概念性说明)
- HSTS 头部
- 设置严格传输安全,提升抗降级攻击能力。
- OCSP Stapling
- 减少在线证书状态查询延迟与隐私泄露风险。
- 前向保密
- 使用支持 ECDHE 的套件,确保会话密钥不被历史泄露影响。
说明:本节为通用概念说明,不直接对应具体源码文件。