gateway2/docs/设计.md
2026-07-10 10:37:11 +08:00

621 lines
29 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 基于 Nginx 与 TongsuoSSL 的国密 SSL 网关方案
## 1. 目标与范围
本方案描述一个基于 Nginx 与 TongsuoSSL 的 SSL 网关程序,用于在网关入口侧支持国密算法套件,并将业务流量安全、稳定地转发到后端服务。
网关重点能力如下:
- 支持国密 TLS/SSL 能力,包括 SM2、SM3、SM4 及国密相关密码套件。
- 支持端口融合,在同一个监听端口上同时兼容国密套件和国际套件。
- 可选支持 SDF 接口对接海光 CCPSDF 动态库通过配置外置指定。
- 复用 Nginx 的高性能网络模型、反向代理能力、负载均衡能力和配置体系。
- 使用 TongsuoSSL 替换或增强 Nginx 原生 OpenSSL 依赖,为 TLS 握手、证书校验、加解密提供国密能力。
- 对外提供统一 HTTPS/GMSSL 入口,对内按策略转发 HTTP、HTTPS 或其他上游协议。
- 将证书、密钥、路由、上游、日志、监控等职责拆分为清晰模块,便于后续实现和运维。
## 2. 总体架构
整体架构采用“增强版 Nginx 网关 + TongsuoSSL 加密底座 + 配置与运维支撑模块”的形式。
```mermaid
flowchart LR
Client["客户端<br/>浏览器、终端、SDK"] --> Listener["监听接入模块<br/>Nginx listen 与 server"]
Listener --> TLS["国密 TLS 处理模块<br/>TongsuoSSL"]
TLS --> Router["请求路由模块<br/>Nginx location、map 与 rewrite"]
Router --> Proxy["反向代理模块<br/>proxy 与 upstream"]
Proxy --> Upstream["后端业务服务"]
Config["配置管理模块"] --> Listener
Config --> TLS
Config --> Router
Config --> Proxy
Cert["证书密钥管理模块"] --> TLS
SDF["SDF 适配模块<br/>海光 CCP 动态库"] --> TLS
SDF --> Cert
%% 日志模块从各组件收集数据(箭头指向 Log
Listener --> Log["日志审计模块"]
TLS --> Log
Router --> Log
Proxy --> Log
%% 监控模块从各组件收集数据(箭头指向 Monitor
Listener --> Monitor["监控告警模块"]
TLS --> Monitor
Proxy --> Monitor
```
核心关系说明:
- Nginx 是网关主进程与流量调度核心,负责监听端口、解析请求、路由匹配、负载均衡和反向代理。
- TongsuoSSL 是 TLS/SSL 能力提供方,嵌入 Nginx SSL 模块调用链中,负责国密握手、国际 TLS 握手、密码套件协商、证书链校验和数据加解密。
- 配置管理模块以 Nginx 配置为主统一描述监听、端口融合、证书、密码套件、SDF 动态库、路由、上游和日志策略。
- 证书密钥管理模块向 TLS 处理模块提供签名证书、加密证书、国际证书、私钥、CA 链和吊销信息。
- 日志审计与监控告警模块不直接参与转发决策,主要消费各模块运行状态和请求结果。
## 3. 模块职责
### 3.1 监听接入模块
职责:
- 基于 Nginx `server``listen` 配置暴露网关入口端口。
- 支持普通 HTTPS 入口、国密 SSL 入口以及同端口融合入口。
- 负责连接接入、连接复用、超时控制、客户端 IP 透传和基础限流。
- 在端口融合入口中不按端口区分算法体系,由国密 TLS 处理模块根据 ClientHello 能力完成协议和套件协商。
- 将完成 TCP 接入后的连接交给国密 TLS 处理模块。
输入:
- 客户端 TCP 连接。
- 监听端口、端口融合开关、协议类型、连接超时、并发限制等配置。
输出:
- 已接入的连接上下文。
- 连接建立、关闭、异常等基础日志和指标。
与其他模块关系:
- 从配置管理模块读取监听端口和协议参数。
- 将连接转交给国密 TLS 处理模块。
- 向日志审计模块和监控告警模块输出连接级事件。
### 3.2 国密 TLS 处理模块
职责:
- 通过 TongsuoSSL 提供国密 TLS/SSL 与标准 TLS 能力。
- 完成协议版本协商、密码套件协商、密钥交换、证书选择、证书校验和会话密钥生成。
- 支持 SM2 签名证书、SM2 加密证书、SM3 摘要算法、SM4 对称加密算法。
- 支持同端口融合,根据客户端 `ClientHello` 中的协议版本、签名算法、密码套件和扩展字段选择国密或国际 TLS 处理路径。
- 支持国际套件所需的 RSA 或 ECDSA 服务端证书,避免国密和国际客户端互相阻塞。
- 支持单向认证和可选的双向认证。
- 根据配置决定是否启用会话复用、会话缓存、OCSP/CRL 校验等能力。
输入:
- 监听接入模块传入的连接上下文。
- 证书、私钥、CA 链、密码套件、协议版本、端口融合策略、SDF 开关等 TLS 配置。
输出:
- 已完成 TLS 握手的安全连接。
- 握手失败原因、证书校验结果、协议类型、密码套件协商结果、SDF 使用结果等日志和指标。
与其他模块关系:
- 被 Nginx SSL 模块调用,底层依赖 TongsuoSSL API。
- 从证书密钥管理模块加载国密证书和私钥。
- 从配置管理模块读取协议版本、密码套件、端口融合、SDF 和认证策略。
- 握手完成后将明文 HTTP 请求交给请求路由模块。
### 3.3 国密协议版本与密码套件范围
本方案首版明确支持以下国密协议与密码套件。实际可用范围需要以最终选定的 TongsuoSSL 与 Nginx 编译组合为准,启动前通过 `nginx -t` 和客户端握手测试确认。
| 协议版本 | 密码套件名称 | 身份认证 | 密钥交换 | 摘要算法 | 对称加密 | 支持级别 | 说明 |
| --------- | ----------------------- | ----------- | ---------------- | ---- | ------- | ---- | ----------------------- |
| GMTLS 1.1 | `ECC-SM2-SM4-CBC-SM3` | SM2 | ECDHE 或 SM2 协商流程 | SM3 | SM4-CBC | 首版必选 | 常见国密双证书场景,兼容性优先 |
| GMTLS 1.1 | `ECDHE-SM2-SM4-CBC-SM3` | SM2 | ECDHE | SM3 | SM4-CBC | 首版必选 | 适合需要前向安全的国密 TLS 场景 |
| GMTLS 1.1 | `ECDHE-SM2-SM4-GCM-SM3` | SM2 | ECDHE | SM3 | SM4-GCM | 首版建议 | 优先选择 AEAD 模式,需确认客户端兼容性 |
| TLS 1.3 | `TLS_SM4_GCM_SM3` | 证书算法可使用 SM2 | TLS 1.3 密钥协商 | SM3 | SM4-GCM | 兼容增强 | 适用于支持 RFC 8998 的客户端和服务端 |
| TLS 1.3 | `TLS_SM4_CCM_SM3` | 证书算法可使用 SM2 | TLS 1.3 密钥协商 | SM3 | SM4-CCM | 兼容增强 | 适用于支持 RFC 8998 的客户端和服务端 |
版本边界:
- 国密专用双证书握手优先按 `GMTLS 1.1` 设计,证书侧使用签名证书和加密证书。
- 标准 `TLS 1.3` 国密密码套件按 RFC 8998 设计,密码套件名称为 `TLS_SM4_GCM_SM3``TLS_SM4_CCM_SM3`
- 标准 `TLS 1.2` 本身没有 IETF 标准化的 `SM2 + SM3 + SM4` 密码套件;如需兼容,应按 TongsuoSSL 提供的国密扩展能力单独验证。
- 标准 RSA、ECDSA、AES 类密码套件不属于本方案的国密重点范围,可作为兼容入口另行配置。
配置原则:
- 默认优先启用 `ECDHE-SM2-SM4-GCM-SM3``TLS_SM4_GCM_SM3`,在客户端不兼容时回退到 CBC 套件。
- 对公网入口不建议启用弱算法、非国密目标算法或无前向安全的配置。
- 每个监听入口应明确协议版本和密码套件,避免一个入口同时承担过多兼容逻辑。
### 3.4 SDF 适配模块
职责:
- 可选对接海光 CCP 的 SDF 接口,为 SM2 私钥运算、随机数生成等能力提供硬件或密码卡支撑。
- SDF 动态库不内置到网关程序中,通过配置指定动态库路径、设备标识、应用标识、密钥索引和访问参数。
- 网关启动或 reload 时按配置加载 SDF 动态库,并完成设备打开、会话创建和密钥可用性检查。
- 当 SDF 模块内密钥已生成且可用时,优先使用 SDF 内部密钥完成私钥相关密码运算。
- 当 SDF 模块内密钥未生成、密钥索引不存在或设备不可用时,按配置退化为使用外部私钥文件和证书。
- SDF 退化只能影响私钥运算来源,不应改变客户端可见的证书链、路由规则和上游转发行为。
输入:
- SDF 开关、动态库路径、设备参数、密钥索引、超时和回退策略。
- 外部证书、外部私钥和 CA 链配置。
输出:
- 可供国密 TLS 处理模块调用的私钥运算接口。
- SDF 初始化状态、密钥命中状态、回退原因和错误信息。
与其他模块关系:
- 被国密 TLS 处理模块调用,用于完成握手中的 SM2 私钥相关运算。
- 与证书密钥管理模块协作,决定当前入口使用 SDF 内部密钥还是外部私钥文件。
- 从配置管理模块读取动态库路径、密钥索引和回退策略。
- 向日志审计模块和监控告警模块输出 SDF 初始化、调用失败和回退事件。
回退规则:
| 场景 | 处理方式 | 日志级别 | 是否允许继续启动 |
| --- | --- | --- | --- |
| 未启用 SDF | 使用外部私钥文件和证书 | info | 是 |
| SDF 动态库路径为空 | 使用外部私钥文件和证书 | warn | 是 |
| SDF 动态库加载失败 | 使用外部私钥文件和证书 | error | 是,前提是外部私钥可用 |
| SDF 设备打开失败 | 使用外部私钥文件和证书 | error | 是,前提是外部私钥可用 |
| SDF 密钥索引不存在 | 使用外部私钥文件和证书 | warn | 是,前提是外部私钥可用 |
| SDF 内部密钥可用 | 使用 SDF 内部密钥 | info | 是 |
| SDF 不可用且外部私钥不可用 | 当前入口启动失败 | error | 否 |
### 3.5 证书密钥管理模块
职责:
- 管理国密双证书体系,包括签名证书、加密证书及其私钥。
- 管理国际 TLS 证书体系,包括 RSA 或 ECDSA 证书及其私钥。
- 当启用 SDF 时,负责校验外部证书与 SDF 内部密钥的公钥匹配关系。
- 管理 CA 根证书、中间证书、客户端认证 CA、CRL 文件等信任材料。
- 支持证书文件加载、权限校验、格式校验和到期时间检查。
- 为后续热更新或自动轮换预留清晰边界,但首版可采用文件配置方式。
输入:
- PEM 格式证书、私钥、CA 链和吊销列表文件。
- 证书路径、密钥路径、SDF 密钥索引、客户端认证策略等配置。
输出:
- 可供 TongsuoSSL 使用的证书、私钥、SDF 密钥引用和信任链。
- 证书加载失败、即将过期、校验失败等告警信息。
与其他模块关系:
- 向国密 TLS 处理模块提供证书、外部密钥材料或 SDF 密钥引用。
- 从配置管理模块读取证书文件路径和认证策略。
- 向日志审计模块记录证书加载和校验结果。
- 向监控告警模块输出证书有效期和加载状态。
### 3.6 请求路由模块
职责:
- 基于 Nginx `server_name`、`location`、`map`、`rewrite` 等能力完成请求匹配。
- 根据域名、路径、Header、方法等条件选择后端上游。
- 负责请求头规范化、必要的安全头处理和客户端信息透传。
- 将路由后的请求交给反向代理模块。
输入:
- 国密 TLS 处理模块解密后的 HTTP 请求。
- 路由规则、域名规则、Header 处理策略等配置。
输出:
- 已匹配上游的请求上下文。
- 路由命中、未命中、重写结果等日志和指标。
与其他模块关系:
- 从配置管理模块读取路由规则。
- 将请求转交给反向代理模块。
- 向日志审计模块输出访问日志所需字段。
### 3.7 反向代理与上游管理模块
职责:
- 使用 Nginx `proxy_pass``upstream` 能力转发请求到后端服务。
- 支持轮询、权重、最少连接、健康检查等上游策略。
- 支持对内 HTTP、HTTPS 或按需扩展其他协议。
- 负责连接池、超时、重试、失败切换和响应返回。
输入:
- 请求路由模块传入的请求上下文。
- 上游服务地址、负载均衡策略、超时、重试等配置。
输出:
- 后端服务响应。
- 上游连接状态、请求耗时、错误码、重试次数等日志和指标。
与其他模块关系:
- 从配置管理模块读取上游列表和代理策略。
- 将响应返回给客户端连接。
- 向日志审计模块和监控告警模块输出转发结果。
### 3.8 配置管理模块
职责:
- 以 Nginx 配置文件为核心,统一管理网关运行参数。
- 管理监听端口、SSL 参数、证书路径、路由规则、上游服务、日志格式和限流策略。
- 支持配置语法检查、灰度发布和 reload 生效。
- 通过模板或配置生成工具降低手工配置错误,但首版可先使用静态配置文件。
输入:
- 运维或部署系统提供的配置文件。
- 环境变量、模板参数或外部配置中心数据。
输出:
- Nginx 可加载的完整配置。
- 配置检查结果和 reload 结果。
与其他模块关系:
- 为监听接入、国密 TLS、证书密钥、请求路由、反向代理、日志监控提供配置来源。
- 不直接处理业务流量,只影响各运行模块的行为。
### 3.9 日志审计模块
职责:
- 记录访问日志、错误日志、TLS 握手日志和安全审计日志。
- 记录客户端 IP、域名、路径、状态码、响应时间、上游地址、密码套件、证书校验结果等关键信息。
- 支持与日志采集系统对接,例如 Filebeat、Fluent Bit 或本地日志轮转工具。
- 为问题排查、合规审计和安全分析提供数据来源。
输入:
- 各模块产生的运行事件、请求结果和异常信息。
输出:
- 标准访问日志、错误日志、安全审计日志。
- 可被外部采集系统消费的结构化或半结构化日志。
与其他模块关系:
- 被监听接入、国密 TLS、请求路由、反向代理、证书密钥等模块调用或间接写入。
- 向运维平台、安全平台提供审计数据。
### 3.10 监控告警模块
职责:
- 采集网关运行指标、TLS 握手指标、证书状态和上游服务状态。
- 关注 QPS、连接数、握手成功率、握手耗时、4xx/5xx、上游耗时、证书剩余有效期等指标。
- 支持通过 Nginx stub_status、日志采集、Exporter 或外部探针方式接入监控系统。
- 根据阈值产生告警,辅助定位证书过期、握手失败、后端异常和容量不足等问题。
输入:
- Nginx 运行状态、日志、证书检查结果、上游探测结果。
输出:
- 指标数据、健康状态和告警事件。
与其他模块关系:
- 从监听接入、国密 TLS、反向代理、证书密钥模块获取运行状态。
- 与日志审计模块互补,日志用于追踪明细,监控用于观察趋势和触发告警。
## 4. 请求处理流程
```mermaid
sequenceDiagram
participant C as 客户端
participant N as Nginx监听接入
participant T as TongsuoSSL国密TLS
participant R as 请求路由
participant P as 反向代理
participant U as 后端服务
C->>N: 建立TCP连接
N->>T: 发起TLS或国密握手
T->>T: 协商协议版本与国密密码套件
T->>T: 加载并校验证书链
T-->>C: 握手完成
C->>T: 发送加密HTTP请求
T->>R: 解密后转交HTTP请求
R->>R: 匹配server、location与upstream
R->>P: 传递路由结果
P->>U: 转发请求
U-->>P: 返回响应
P-->>T: 返回明文响应
T-->>C: 加密响应并返回
```
流程说明:
1. 客户端连接网关监听端口。
2. Nginx 接收 TCP 连接并进入 SSL 握手流程。
3. TongsuoSSL 负责国密协议与密码套件协商。
4. 握手成功后TongsuoSSL 解密 HTTP 请求。
5. Nginx 按配置执行域名、路径和请求规则匹配。
6. 反向代理模块将请求转发到目标上游。
7. 后端响应经网关返回客户端,出口侧继续由 TLS 模块加密。
## 5. 部署形态
建议首版采用静态编译或明确绑定 TongsuoSSL 的 Nginx 构建方式:
```text
Nginx 主程序
├── Nginx core/event/http 模块
├── Nginx ssl/http_ssl 模块
├── TongsuoSSL 库
├── 网关配置文件
├── 国密证书与私钥文件
└── 日志与监控采集组件
```
模块部署关系:
- Nginx 与 TongsuoSSL 位于同一运行实例中TongsuoSSL 作为 Nginx SSL 能力的底层库。
- 配置文件、证书文件和日志目录通过部署系统挂载或复制到实例内。
- 监控采集组件可与网关同机部署,也可由外部监控系统远程采集。
- 后端服务与网关之间可处于同一内网,是否启用内侧 TLS 根据安全要求决定。
## 6. 端口融合策略
端口融合指同一个 `listen` 端口同时支持国密密码套件和国际密码套件,避免为不同客户端分别暴露不同端口。
设计原则:
- 同一端口同时配置国密套件和国际套件,由 TLS 握手阶段根据客户端能力自动协商。
- 国密客户端优先协商 `GMTLS 1.1``TLS 1.3` 国密套件,国际客户端协商标准 RSA、ECDSA、AES 或 CHACHA20 套件。
- 服务端需要同时准备国密证书和国际证书TLS 处理模块根据握手上下文选择匹配证书。
- 对不支持国密的普通客户端,不应因为启用国密套件导致握手失败。
- 对只支持国密的客户端,不应因为同时配置国际套件导致降级到非国密算法。
同端口融合关系如下:
```mermaid
flowchart LR
ClientHello["ClientHello<br/>协议版本、签名算法、密码套件"] --> Selector["TLS 能力选择<br/>TongsuoSSL"]
Selector --> GM["国密路径<br/>GMTLS 1.1 或 TLS 1.3 SM 套件"]
Selector --> INTL["国际路径<br/>标准 TLS 套件"]
GM --> GMCert["国密证书<br/>SM2 签名证书与加密证书"]
INTL --> IntlCert["国际证书<br/>RSA 或 ECDSA 证书"]
GMCert --> Router["统一请求路由"]
IntlCert --> Router
```
注意事项:
- 端口融合属于 TLS 握手层能力,路由模块不应依赖“国密或国际”来决定默认业务路由。
- 如果业务必须区分国密和国际来源,应通过独立 Header、变量或日志字段显式标记避免隐式依赖端口。
- 若客户端兼容性复杂,可保留独立国密端口和独立国际端口作为排障入口。
## 7. 配置边界
首版建议将配置划分为以下文件或片段:
```text
conf/
├── nginx.conf # 主配置,定义 worker、日志、全局参数
├── conf.d/
│ ├── gateway.conf # 网关 server、SSL、端口融合和路由配置
│ ├── sdf.conf # 可选 SDF 动态库、设备和密钥索引配置
│ └── upstream.conf # 后端 upstream 配置
├── certs/
│ ├── sign.crt # 国密签名证书
│ ├── sign.key # 国密签名私钥
│ ├── enc.crt # 国密加密证书
│ ├── enc.key # 国密加密私钥
│ ├── intl.crt # 国际 TLS 证书
│ ├── intl.key # 国际 TLS 私钥
│ └── ca.crt # CA 证书链
└── logs/
├── access.log
├── error.log
└── ssl_audit.log
```
职责边界:
- `nginx.conf` 只放全局配置,不承载业务路由细节。
- `gateway.conf` 定义入口、端口融合、SSL 参数、server_name、location 和代理规则。
- `sdf.conf` 定义 SDF 开关、动态库路径、设备参数、密钥索引和回退策略。
- `upstream.conf` 定义后端服务池和负载均衡策略。
- `certs/` 只保存证书和密钥材料,权限应独立控制。
- `logs/` 只作为本地日志落地点,由外部系统负责采集和归档。
## 8. 安全职责划分
| 安全事项 | 责任模块 | 说明 |
| -------- | -------------------- | ------------------------ |
| 国密密码套件支持 | 国密 TLS 处理模块 | 由 TongsuoSSL 提供底层算法与协议支持 |
| 端口融合协商 | 监听接入模块、国密 TLS 处理模块 | 同一端口根据 ClientHello 协商国密或国际套件 |
| SDF 密钥运算 | SDF 适配模块、证书密钥管理模块 | 可选调用海光 CCP SDF 动态库,失败时按策略回退 |
| 服务端证书加载 | 证书密钥管理模块 | 提供签名证书、加密证书和私钥 |
| 客户端证书认证 | 国密 TLS 处理模块、证书密钥管理模块 | 可按入口启用双向认证 |
| 后端访问控制 | 请求路由模块、反向代理模块 | 通过路由规则和网络策略限制上游访问 |
| 敏感信息保护 | 配置管理模块、证书密钥管理模块 | 限制私钥文件权限,避免日志泄露密钥 |
| 安全审计 | 日志审计模块 | 记录握手失败、证书异常和访问异常 |
| 证书过期告警 | 监控告警模块 | 采集证书剩余有效期并触发告警 |
## 9. 实施阶段建议
### 阶段一:基础可用版本
目标:验证 Nginx 与 TongsuoSSL 能够完成国密 TLS 接入和基础反向代理。
主要工作:
- 构建绑定 TongsuoSSL 的 Nginx。
- 配置同端口国密与国际套件融合入口。
- 准备国密服务端证书、国际 TLS 服务端证书和 CA 证书。
- 配置国密 SSL、国际 TLS 和端口融合所需密码套件。
- 配置单个后端 upstream 并完成请求转发。
- 输出访问日志和错误日志。
验收标准:
- 客户端可使用国密 TLS 或国际 TLS 在同一端口成功连接网关。
- 网关可将请求转发到后端服务并返回响应。
- 握手失败、证书错误、上游错误可在日志中定位。
### 阶段二:生产增强版本
目标:完善稳定性、安全性和运维能力。
主要工作:
- 增加多 upstream 与负载均衡策略。
- 增加双向认证配置能力。
- 增加证书有效期检查、SDF 初始化状态检查和告警。
- 增加结构化访问日志和 TLS 审计字段。
- 增加配置检查、reload 和回滚流程。
验收标准:
- 多后端转发策略符合配置预期。
- 客户端证书校验策略可按入口控制。
- 证书即将过期、SDF 不可用、上游异常、握手异常可触发监控告警。
- 配置变更可通过检查后平滑 reload。
### 阶段三:平台化版本
目标:将网关能力沉淀为可持续运维的平台组件。
主要工作:
- 对接配置中心或配置生成工具。
- 支持证书自动轮换、集中托管或 SDF 内部密钥生命周期管理。
- 接入统一日志、监控和告警平台。
- 形成标准部署包、启动脚本和运维手册。
验收标准:
- 网关实例可批量部署和一致化配置。
- 证书轮换或 SDF 密钥切换流程不影响业务连续性。
- 运维人员可通过统一平台观察运行状态并定位问题。
## 10. 推荐版本与工作量预估
### 10.1 推荐版本
| 组件 | 推荐版本 | 备选版本 | 推荐理由 | 注意事项 |
| --- | --- | --- | --- | --- |
| Nginx | `1.30.3` | `1.31.2` | `1.30.x` 属于稳定分支,适合作为首版工程基线;`1.31.x` 更新但更偏主线验证 | 如需使用更新 HTTP 或 SSL 能力,可在专项测试后切换到 `1.31.2` |
| TongsuoSSL | `8.4.0` | `8.3.3` | 当前可见稳定标签中 `8.4.0` 较新适合作为国密、TLS 1.3 SM 套件和后续 SDF 适配基线 | 需要实测与 Nginx SSL 模块、端口融合、SDF 动态库加载的兼容性 |
推荐组合:
- 首选组合:`Nginx 1.30.3 + TongsuoSSL 8.4.0`。
- 保守组合:`Nginx 1.30.3 + TongsuoSSL 8.3.3`,用于 `8.4.0` 与 SDF 或端口融合存在兼容问题时回退。
- 验证组合:`Nginx 1.31.2 + TongsuoSSL 8.4.0`,仅建议在需要 Nginx 主线能力时进入兼容性测试。
版本锁定原则:
- 研发、测试和交付环境必须固定具体 tag 或源码提交号,不使用浮动分支。
- 编译产物需要记录 Nginx 版本、TongsuoSSL 版本、编译参数、SDF 动态库版本和操作系统版本。
- 升级任一组件时,需要重新执行国密握手、国际 TLS 握手、端口融合、SDF 回退和反向代理回归测试。
### 10.2 开发工作量预估
以下预估按 2 名后端或基础设施开发人员投入计算,默认已有可用的国密证书、国际证书、测试客户端和海光 CCP SDF 测试环境。如果 SDF 设备、证书或客户端环境需要额外准备,工期需要顺延。
| 阶段 | 工作内容 | 预估人日 | 主要产出 |
| --- | --- | --- | --- |
| 方案细化 | 明确协议范围、密码套件、端口融合策略、SDF 回退策略和配置格式 | 2-3 | 详细设计、配置样例、测试清单 |
| 构建集成 | 编译 Nginx 与 TongsuoSSL固化构建脚本和版本信息 | 3-5 | 可重复构建脚本、二进制包、版本说明 |
| 国密 TLS 接入 | 配置 GMTLS 1.1、TLS 1.3 SM 套件、国密双证书和基础反向代理 | 4-6 | 国密入口、证书配置、代理配置 |
| 端口融合 | 同端口支持国密和国际套件,完成证书选择、套件优先级和日志字段 | 5-8 | 融合入口配置、协商日志、兼容性说明 |
| SDF 适配 | 外置加载海光 CCP SDF 动态库,完成初始化、密钥索引检查、私钥运算调用和回退 | 8-12 | SDF 配置、适配代码或补丁、回退逻辑 |
| 日志监控 | 增加协议类型、密码套件、SDF 状态、回退原因和上游状态观测 | 3-5 | 日志格式、指标清单、告警建议 |
| 打包部署 | 启停脚本、配置模板、证书目录、日志目录和部署说明 | 3-4 | 部署包、目录规范、运维说明 |
| 开发自测 | 开发侧握手、代理、reload、异常回退和基础性能自测 | 4-6 | 自测记录、问题修复 |
开发合计:
- 不含 SDF`24-37` 人日2 人并行约 `3-4` 周。
- 含 SDF`32-49` 人日2 人并行约 `4-6` 周。
### 10.3 测试工作量预估
以下预估按 1-2 名测试人员投入计算,包含功能、兼容性、异常、稳定性和基础性能测试。
| 测试类型 | 测试内容 | 预估人日 | 验证重点 |
| --- | --- | --- | --- |
| 构建验证 | 版本号、编译参数、依赖库路径、启动和 reload | 1-2 | 产物可重复、配置检查通过 |
| 国密功能测试 | GMTLS 1.1、TLS 1.3 SM 套件、国密双证书、单向和双向认证 | 4-6 | 握手成功、证书校验、套件正确 |
| 国际 TLS 测试 | RSA、ECDSA、标准 TLS 1.2 和 TLS 1.3 客户端接入 | 2-4 | 国际客户端兼容性 |
| 端口融合测试 | 同端口国密客户端和国际客户端混合接入 | 5-8 | 协商正确、互不影响、日志可区分 |
| SDF 功能测试 | 动态库加载、设备打开、密钥索引命中、私钥运算 | 5-8 | SDF 路径可用、性能和错误处理正常 |
| SDF 回退测试 | 未生成密钥、索引不存在、动态库缺失、设备不可用、外部私钥缺失 | 4-6 | 按规则回退或失败,日志清晰 |
| 代理功能测试 | 路由、Header 透传、负载均衡、超时、重试和上游故障 | 3-5 | 代理行为符合配置 |
| 安全测试 | 弱套件禁用、证书过期、错误证书、客户端证书异常 | 3-5 | 不接受非法连接,审计可追踪 |
| 稳定性测试 | 长连接、并发连接、reload、日志轮转和异常恢复 | 5-8 | 长时间运行无明显异常 |
| 基础性能测试 | 握手吞吐、请求吞吐、SDF 与外部私钥性能对比 | 4-6 | 形成容量基线 |
测试合计:
- 不含 SDF`27-44` 人日1-2 人约 `3-5` 周。
- 含 SDF`36-58` 人日1-2 人约 `4-7` 周。
### 10.4 总体周期建议
| 范围 | 开发周期 | 测试周期 | 总周期建议 |
| --- | --- | --- | --- |
| 基础国密网关,不含端口融合和 SDF | 2-3 周 | 2-3 周 | 4-6 周 |
| 含端口融合,不含 SDF | 3-4 周 | 3-5 周 | 6-8 周 |
| 含端口融合和海光 CCP SDF | 4-6 周 | 4-7 周 | 8-12 周 |
主要风险:
- 端口融合依赖客户端 `ClientHello` 能力,老旧国密客户端可能存在非标准行为。
- SDF 适配依赖海光 CCP 动态库、设备驱动、密钥生命周期和接口行为,建议尽早取得真实测试环境。
- TongsuoSSL 与 Nginx SSL 模块的接口兼容性需要以实际编译和握手测试为准。
- 国密证书签发、双证书匹配和 SDF 内部密钥公钥匹配会影响联调进度。
## 11. 后续设计重点
后续进入实现前,需要进一步明确以下事项:
- TongsuoSSL 与 Nginx 的具体版本组合。
- 国密证书格式、双证书配置方式和证书签发来源。
- 端口融合入口需要支持的客户端范围,以及国密与国际套件的优先级。
- 海光 CCP SDF 动态库版本、SDF 接口兼容性、密钥索引规划和回退策略。
- 后端协议是否必须加密,以及是否需要内侧双向认证。
- 日志字段、审计留存周期和监控接入方式。
- 部署环境是物理机、虚拟机、容器还是 Kubernetes。
## 12. 成功标准
本方案对应的网关程序实现完成后,应满足以下标准:
- 客户端可通过同一端口使用国密 TLS 或国际 TLS 与网关建立安全连接。
- 网关可基于域名、路径或 Header 将请求转发到指定后端。
- 证书、SDF、路由、上游和日志配置边界清晰便于维护。
- TLS 握手、端口融合协商、SDF 状态、请求路由、上游代理、证书加载均可观测。
- 常见异常场景可通过日志和监控定位包括证书错误、SDF 回退、握手失败、路由未命中、上游不可用。