106 lines
2.4 KiB
Markdown
106 lines
2.4 KiB
Markdown
# 小型CA系统后端设计文档
|
|
|
|
## 1. 技术架构
|
|
|
|
### 1.1 技术选型
|
|
- **编程语言**: Go 1.18+
|
|
- **Web框架**: Gin
|
|
- **数据库**: MongoDB 5.0+
|
|
- **证书工具**: OpenSSL 3.0
|
|
- **认证方式**: JWT
|
|
|
|
### 1.2 系统架构图
|
|
```
|
|
[前端] → [API Gateway] → [证书服务] → [OpenSSL]
|
|
↓
|
|
[黑名单服务] → [MongoDB]
|
|
```
|
|
|
|
## 2. API接口设计
|
|
|
|
### 2.1 证书签发接口
|
|
- **路径**: /api/v1/certificates
|
|
- **方法**: POST
|
|
- **请求参数**:
|
|
- domain (string): 域名
|
|
- organization (string): 组织名称
|
|
- validity (int): 有效期(天)
|
|
- **响应**:
|
|
- cert (string): 证书内容
|
|
- key (string): 私钥内容
|
|
- ca (string): CA证书
|
|
|
|
### 2.2 黑名单查询接口
|
|
- **路径**: /api/v1/blacklist
|
|
- **方法**: GET
|
|
- **响应**:
|
|
- items ([]BlacklistItem): 黑名单条目列表
|
|
|
|
### 2.3 证书撤销接口
|
|
- **路径**: /api/v1/certificates/{serial}
|
|
- **方法**: DELETE
|
|
- **权限**: 管理员
|
|
|
|
## 3. 数据库模型
|
|
|
|
### 3.1 证书模型
|
|
```go
|
|
type Certificate struct {
|
|
SerialNumber string `bson:"serial"`
|
|
Domain string `bson:"domain"`
|
|
Organization string `bson:"org"`
|
|
IssuedAt time.Time `bson:"issued_at"`
|
|
ExpiresAt time.Time `bson:"expires_at"`
|
|
CertContent string `bson:"cert"`
|
|
KeyContent string `bson:"key"`
|
|
}
|
|
```
|
|
|
|
### 3.2 黑名单模型
|
|
```go
|
|
type BlacklistItem struct {
|
|
ID primitive.ObjectID `bson:"_id"`
|
|
Type string `bson:"type"` // domain/ip
|
|
Value string `bson:"value"`
|
|
Reason string `bson:"reason"`
|
|
RevokedAt time.Time `bson:"revoked_at"`
|
|
RevokedBy string `bson:"revoked_by"`
|
|
}
|
|
```
|
|
|
|
## 4. 核心流程
|
|
|
|
### 4.1 证书签发流程
|
|
1. 验证JWT令牌和用户权限
|
|
2. 生成CSR配置文件
|
|
3. 调用OpenSSL生成证书
|
|
4. 将证书信息存入数据库
|
|
5. 返回证书给客户端
|
|
|
|
### 4.2 黑名单管理流程
|
|
1. 验证管理员权限
|
|
2. 查询/更新MongoDB
|
|
3. 记录操作日志
|
|
4. 返回操作结果
|
|
|
|
## 5. 安全设计
|
|
|
|
### 5.1 认证授权
|
|
- 基于JWT的RBAC实现
|
|
- 令牌有效期: 2小时
|
|
- 敏感操作需要二次验证
|
|
|
|
### 5.2 通信安全
|
|
- 强制HTTPS
|
|
- 证书签名使用SHA-256
|
|
- 私钥加密存储
|
|
|
|
## 6. 性能优化
|
|
|
|
### 6.1 缓存策略
|
|
- 黑名单查询结果缓存
|
|
- 证书签发请求限流
|
|
|
|
### 6.2 并发控制
|
|
- 使用Go协程处理并发请求
|
|
- 数据库连接池配置 |