|
|
|
|
@ -0,0 +1,243 @@
|
|
|
|
|
# 小型CA系统
|
|
|
|
|
|
|
|
|
|
这是一个前后端分离的小型CA(证书颁发机构)系统,用于管理数字证书的申请、签发、验证和吊销。
|
|
|
|
|
|
|
|
|
|
## 技术栈
|
|
|
|
|
|
|
|
|
|
### 后端
|
|
|
|
|
- Python 3.8+
|
|
|
|
|
- Flask 2.3.3
|
|
|
|
|
- Flask-SQLAlchemy(数据库ORM)
|
|
|
|
|
- PyMySQL(MySQL驱动)
|
|
|
|
|
- cryptography(证书操作)
|
|
|
|
|
- PyJWT(Token认证)
|
|
|
|
|
- bcrypt(密码加密)
|
|
|
|
|
|
|
|
|
|
### 前端
|
|
|
|
|
- Vue 3
|
|
|
|
|
- Vue Router 4
|
|
|
|
|
- Element Plus(UI组件库)
|
|
|
|
|
- Axios(HTTP客户端)
|
|
|
|
|
- Vite(构建工具)
|
|
|
|
|
|
|
|
|
|
### 数据库
|
|
|
|
|
- MySQL 5.7+
|
|
|
|
|
|
|
|
|
|
## 项目结构
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
CA_system/
|
|
|
|
|
├── backend/ # Flask后端
|
|
|
|
|
│ ├── app.py # 应用入口
|
|
|
|
|
│ ├── config.py # 配置文件
|
|
|
|
|
│ ├── models.py # 数据模型
|
|
|
|
|
│ ├── requirements.txt # Python依赖
|
|
|
|
|
│ ├── routes/ # 路由模块
|
|
|
|
|
│ │ ├── auth.py # 认证路由
|
|
|
|
|
│ │ ├── certificate.py # 证书路由
|
|
|
|
|
│ │ └── admin.py # 管理员路由
|
|
|
|
|
│ ├── utils/ # 工具函数
|
|
|
|
|
│ │ ├── auth_utils.py # 认证工具
|
|
|
|
|
│ │ └── cert_utils.py # 证书工具
|
|
|
|
|
│ └── middleware/ # 中间件
|
|
|
|
|
│ └── auth_middleware.py
|
|
|
|
|
├── frontend/ # Vue前端
|
|
|
|
|
│ ├── src/
|
|
|
|
|
│ │ ├── api/ # API接口
|
|
|
|
|
│ │ ├── views/ # 页面组件
|
|
|
|
|
│ │ ├── layouts/ # 布局组件
|
|
|
|
|
│ │ ├── router/ # 路由配置
|
|
|
|
|
│ │ └── utils/ # 工具函数
|
|
|
|
|
│ ├── package.json
|
|
|
|
|
│ └── vite.config.js
|
|
|
|
|
├── database_supplement.sql # 数据库补充SQL
|
|
|
|
|
└── README.md
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 功能特性
|
|
|
|
|
|
|
|
|
|
### 用户功能
|
|
|
|
|
1. **用户注册和登录**
|
|
|
|
|
- 用户注册新账号
|
|
|
|
|
- 用户名密码登录
|
|
|
|
|
- Token认证机制
|
|
|
|
|
|
|
|
|
|
2. **证书查询**
|
|
|
|
|
- 查看所有已颁发的证书
|
|
|
|
|
- 显示证书ID、创建时间、过期时间、状态
|
|
|
|
|
- 查看证书详细信息
|
|
|
|
|
|
|
|
|
|
3. **证书下载**
|
|
|
|
|
- 下载.cer格式的证书文件
|
|
|
|
|
|
|
|
|
|
4. **证书吊销**
|
|
|
|
|
- 用户可吊销自己的证书
|
|
|
|
|
- 吊销后的证书将被加入CRL(证书吊销列表)
|
|
|
|
|
|
|
|
|
|
5. **证书注册**
|
|
|
|
|
- 填写证书基本信息(国家、省、市、组织、部门、域名、邮箱)
|
|
|
|
|
- 上传CSR文件或自动生成RSA密钥对
|
|
|
|
|
- 提交公钥后等待管理员审核
|
|
|
|
|
|
|
|
|
|
6. **证书验证**
|
|
|
|
|
- 上传.cer证书文件
|
|
|
|
|
- 验证证书是否由本CA签发
|
|
|
|
|
- 显示证书详细信息
|
|
|
|
|
|
|
|
|
|
### 管理员功能
|
|
|
|
|
1. **证书审核**
|
|
|
|
|
- 查看待审核的证书申请
|
|
|
|
|
- 同意申请并签发证书
|
|
|
|
|
- 拒绝申请
|
|
|
|
|
|
|
|
|
|
2. **证书管理**
|
|
|
|
|
- 查看所有证书
|
|
|
|
|
- 吊销证书
|
|
|
|
|
|
|
|
|
|
## 安装和运行
|
|
|
|
|
|
|
|
|
|
### 1. 数据库设置
|
|
|
|
|
|
|
|
|
|
首先执行数据库创建脚本和补充SQL:
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 连接到MySQL
|
|
|
|
|
mysql -u root -p
|
|
|
|
|
|
|
|
|
|
# 执行数据库创建脚本(根据您提供的SQL)
|
|
|
|
|
# 然后执行补充SQL
|
|
|
|
|
mysql -u root -p Simple_CA < init_database.sql
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 2. 后端设置
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 切换到后端目录
|
|
|
|
|
cd backend
|
|
|
|
|
|
|
|
|
|
# 安装Python依赖
|
|
|
|
|
pip install -r requirements.txt
|
|
|
|
|
|
|
|
|
|
# 运行Flask应用
|
|
|
|
|
python app.py
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
后端服务将运行在 `http://localhost:5000`
|
|
|
|
|
|
|
|
|
|
### 3. 前端设置
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
# 切换到前端目录
|
|
|
|
|
cd frontend
|
|
|
|
|
|
|
|
|
|
# 安装依赖
|
|
|
|
|
npm install
|
|
|
|
|
|
|
|
|
|
# 开发模式运行
|
|
|
|
|
npm run dev
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
前端服务将运行在 `http://localhost:8080`
|
|
|
|
|
|
|
|
|
|
### 4. 创建管理员账号
|
|
|
|
|
|
|
|
|
|
首次运行需要创建管理员账号,可以通过以下方式:
|
|
|
|
|
|
|
|
|
|
1. 使用MySQL命令行创建:
|
|
|
|
|
```sql
|
|
|
|
|
INSERT INTO users (username, password, authority, created_at, updated_at)
|
|
|
|
|
VALUES ('admin', '<bcrypt加密后的密码>', 1, NOW(), NOW());
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. 或先注册普通账号,然后在数据库中修改authority字段为1
|
|
|
|
|
|
|
|
|
|
## 配置说明
|
|
|
|
|
|
|
|
|
|
### 后端配置(backend/config.py)
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
MYSQL_HOST = '127.0.0.1' # MySQL主机
|
|
|
|
|
MYSQL_PORT = 3306 # MySQL端口
|
|
|
|
|
MYSQL_USER = 'root' # MySQL用户名
|
|
|
|
|
MYSQL_PASSWORD = 'sxd123' # MySQL密码
|
|
|
|
|
MYSQL_DATABASE = 'Simple_CA' # 数据库名
|
|
|
|
|
|
|
|
|
|
SECRET_KEY = 'your-secret-key-change-in-production' # JWT密钥
|
|
|
|
|
CERT_VALIDITY_DAYS = 365 # 证书有效期(天)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
### 前端配置(frontend/vite.config.js)
|
|
|
|
|
|
|
|
|
|
代理配置已设置,开发环境下会自动代理API请求到后端。
|
|
|
|
|
|
|
|
|
|
## API接口
|
|
|
|
|
|
|
|
|
|
### 认证接口
|
|
|
|
|
- `POST /api/auth/register` - 用户注册
|
|
|
|
|
- `POST /api/auth/login` - 用户登录
|
|
|
|
|
- `POST /api/auth/logout` - 用户退出
|
|
|
|
|
- `GET /api/auth/me` - 获取当前用户信息
|
|
|
|
|
|
|
|
|
|
### 证书接口
|
|
|
|
|
- `GET /api/certificate/list` - 获取证书列表
|
|
|
|
|
- `GET /api/certificate/detail/:id` - 获取证书详情
|
|
|
|
|
- `GET /api/certificate/download/:id` - 下载证书
|
|
|
|
|
- `POST /api/certificate/revoke/:id` - 吊销证书
|
|
|
|
|
- `POST /api/certificate/verify` - 验证证书
|
|
|
|
|
- `POST /api/certificate/request` - 申请证书
|
|
|
|
|
- `POST /api/certificate/request/upload-csr` - 上传CSR文件
|
|
|
|
|
- `POST /api/certificate/request/submit-key` - 提交公钥
|
|
|
|
|
- `POST /api/certificate/generate-keypair` - 生成密钥对
|
|
|
|
|
|
|
|
|
|
### 管理员接口
|
|
|
|
|
- `GET /api/admin/requests` - 获取证书申请列表
|
|
|
|
|
- `POST /api/admin/request/:id/approve` - 同意申请
|
|
|
|
|
- `POST /api/admin/request/:id/reject` - 拒绝申请
|
|
|
|
|
- `GET /api/admin/certificates` - 获取所有证书
|
|
|
|
|
- `POST /api/admin/certificate/:id/revoke` - 吊销证书
|
|
|
|
|
|
|
|
|
|
## 注意事项
|
|
|
|
|
|
|
|
|
|
1. **CA根证书**:首次运行时会自动生成CA根证书和私钥,存储在`backend/ca/`目录下。请妥善保管CA私钥。
|
|
|
|
|
|
|
|
|
|
2. **私钥安全**:系统不会存储用户的私钥,用户需自行保存生成的私钥。
|
|
|
|
|
|
|
|
|
|
3. **证书格式**:系统使用PEM格式的X.509证书。
|
|
|
|
|
|
|
|
|
|
4. **生产环境**:部署到生产环境前,请:
|
|
|
|
|
- 修改`SECRET_KEY`
|
|
|
|
|
- 使用HTTPS
|
|
|
|
|
- 配置适当的数据库权限
|
|
|
|
|
- 设置防火墙规则
|
|
|
|
|
|
|
|
|
|
## 数据库设计补充说明
|
|
|
|
|
|
|
|
|
|
已补充以下字段:
|
|
|
|
|
- `certificates.certificate_content` - 存储证书内容
|
|
|
|
|
- `certificates.serial_number` - 证书序列号
|
|
|
|
|
- `ca_requests.csr_content` - CSR文件内容
|
|
|
|
|
|
|
|
|
|
## 开发说明
|
|
|
|
|
|
|
|
|
|
### 后端开发
|
|
|
|
|
- 使用Flask Blueprint组织路由
|
|
|
|
|
- 使用SQLAlchemy ORM操作数据库
|
|
|
|
|
- JWT Token进行身份认证
|
|
|
|
|
- 使用装饰器实现权限控制
|
|
|
|
|
|
|
|
|
|
### 前端开发
|
|
|
|
|
- Vue 3 Composition API
|
|
|
|
|
- Element Plus组件库
|
|
|
|
|
- Axios进行API调用
|
|
|
|
|
- Vue Router进行路由管理
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|