# SSL/TLS 配置 **本文引用的文件** - [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) ## 目录 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["应用入口
src/index.ts"] --> B["HTTPS 服务器创建
读取 server.key / server.cert"] A --> C["Express 应用创建
src/server.ts"] C --> D["静态资源与路由
客户端页面与 API"] A --> E["WebSocket 信令服务
src/websocket.ts"] F["运行脚本
package.json"] --> A G["启动批处理
run.bat"] --> A H["证书与密钥
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 "应用入口
src/index.ts" participant HTTPS as "HTTPS 服务器" participant Express as "Express 应用
src/server.ts" participant WS as "WebSocket 信令
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["解析命令行参数
确定 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["文件系统
读取 server.key / server.cert"] Index --> Express["Express 应用
src/server.ts"] Express --> Static["静态资源与路由"] Index --> WS["WebSocket 信令
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.key:HTTPS 私钥文件 - server.cert:HTTPS 证书文件 章节来源 - [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 常用命令(概念性说明) - 证书转 DER:openssl x509 -in server.pem -outform DER -out server.der - DER 转 PEM:openssl 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#12:openssl 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 的套件,确保会话密钥不被历史泄露影响。 说明:本节为通用概念说明,不直接对应具体源码文件。