Skip to content

Commit d1f5b60

Browse files
committed
feat: ra veridation
1 parent 406ccde commit d1f5b60

File tree

7 files changed

+812
-44
lines changed

7 files changed

+812
-44
lines changed

crates/capsula-pki/TODO.md

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# Capsula-PKI 开发任务清单
2+
3+
## 📋 项目概览
4+
基于 Rust 的完整 PKI (公钥基础设施) 实现,支持完整的证书生命周期管理。
5+
6+
## 🎯 核心功能模块
7+
8+
### ✅ 已完成模块
9+
- [x] **CSR 模块** (`src/ra/csr.rs`) - 证书签名请求
10+
- [x] CSR 生成和解析
11+
- [x] PEM/DER 格式支持
12+
- [x] 签名验证
13+
- [x] **Cert 模块** (`src/ra/cert.rs`) - 证书管理
14+
- [x] 证书生成(从CSR)
15+
- [x] 自签名证书
16+
- [x] X.509 格式支持
17+
- [x] 证书验证
18+
19+
### 🔄 需要验证的模块 (优先级:高)
20+
> 这些模块由 AI 生成,需要人工验证和测试
21+
22+
#### 1. CA 模块验证 (`src/ca/mod.rs`)
23+
- [ ] 验证根 CA 生成功能
24+
- [ ] 测试中间 CA 创建
25+
- [ ] 检查证书签发流程
26+
- [ ] 验证多算法支持(Ed25519/RSA/ECC)
27+
- [ ] 测试 CA 配置和导入/导出
28+
29+
#### 2. RA 模块验证 (`src/ra/`)
30+
- [ ] 验证 CSR 接收和验证流程
31+
- [ ] 测试身份认证机制
32+
- [ ] 检查审批工作流程(手动/自动)
33+
- [ ] 验证请求处理器功能
34+
35+
#### 3. 密钥存储验证 (`src/keystore/`)
36+
- [ ] 验证文件系统存储后端
37+
- [ ] 测试密钥元数据管理
38+
- [ ] 检查存储接口实现
39+
- [ ] 验证密钥检索功能
40+
41+
## 🚀 开发优先级和顺序
42+
43+
### 阶段一:RA 模块完善 (第1-2周) - 最高优先级
44+
> **依赖关系**:CA 依赖 RA,必须先完善 RA 作为 PKI 系统入口
45+
46+
1. **RA 核心功能验证和完善**
47+
- [ ] 验证 CSR 接收和处理流程 (`src/ra/request_handler.rs`)
48+
- [ ] 完善身份认证机制 (`src/ra/identity_auth.rs`)
49+
- [ ] 实现审批工作流程 (`src/ra/approval_workflow.rs`)
50+
- [ ] 完善 CSR 验证逻辑 (`src/ra/validation.rs`)
51+
- [ ] 测试 RA 配置和策略管理
52+
53+
2. **密钥存储模块完善** (支撑 RA/CA)
54+
- [ ] 实现 `store_key()``retrieve_key()` 的完整功能
55+
- [ ] 添加密钥加密存储支持
56+
- [ ] 实现密钥轮换机制
57+
- [ ] 添加 HSM 集成接口(预留)
58+
59+
### 阶段二:CA 模块验证 (第3-4周)
60+
> **基于完善的 RA 来验证 CA 功能**
61+
62+
1. **CA 模块深度测试**
63+
- [ ] 验证 RA → CA 的完整集成流程
64+
- [ ] 编写完整的 CA 集成测试
65+
- [ ] 验证根 CA → 中间 CA → 最终证书 的完整链路
66+
- [ ] 测试不同算法的兼容性
67+
- [ ] 性能基准测试
68+
69+
### 阶段三:生命周期管理 (第5-6周)
70+
3. **证书生命周期模块** (`src/lifecycle/`)
71+
- [ ] 设计证书更新(renewal)机制
72+
- [ ] 实现证书吊销(revocation)功能
73+
- [ ] 添加证书过期通知系统
74+
- [ ] 实现证书自动续期
75+
76+
4. **证书状态查询模块** (`src/status/`)
77+
- [ ] 实现 CRL(证书吊销列表)生成和管理
78+
- [ ] 添加 OCSP(在线证书状态协议)支持
79+
- [ ] 实现证书状态缓存机制
80+
- [ ] 添加状态查询 API
81+
82+
### 阶段三:高级功能 (第5-6周)
83+
5. **高级密钥管理**
84+
- [ ] 密钥托管与导出功能
85+
- [ ] 密钥恢复机制
86+
- [ ] 密钥轮换策略
87+
- [ ] 硬件安全模块(HSM)集成
88+
89+
6. **安全增强**
90+
- [ ] 审计日志系统
91+
- [ ] 访问控制机制
92+
- [ ] 密钥泄露检测
93+
- [ ] 安全策略配置
94+
95+
### 阶段四:性能优化和集成 (第7-8周)
96+
7. **性能优化**
97+
- [ ] 缓存策略实现
98+
- [ ] 并发处理优化
99+
- [ ] 内存使用优化
100+
- [ ] 密码学操作优化
101+
102+
8. **库集成和文档**
103+
- [ ] 端到端测试套件
104+
- [ ] 库文档生成 (rustdoc)
105+
- [ ] 使用指南和示例
106+
- [ ] 集成测试覆盖
107+
108+
## 🧪 测试策略
109+
110+
### 单元测试
111+
- [ ] 每个核心模块 >80% 代码覆盖率
112+
- [ ] 边界条件和错误情况测试
113+
- [ ] 加密算法兼容性测试
114+
115+
### 集成测试
116+
- [ ] 完整 PKI 工作流程测试
117+
- [ ] 跨模块交互测试
118+
- [ ] 性能和压力测试
119+
120+
### 安全测试
121+
- [ ] 密码学安全性验证
122+
- [ ] 漏洞扫描和渗透测试
123+
- [ ] 合规性检查
124+
125+
## 📝 当前已知问题
126+
127+
### 需要修复的问题
128+
1. **RA 模块功能待验证** (最高优先级)
129+
- `request_handler.rs` 请求处理逻辑需要验证
130+
- `identity_auth.rs` 身份认证机制需要完善
131+
- `approval_workflow.rs` 审批流程需要测试
132+
- `validation.rs` CSR 验证逻辑需要加强
133+
134+
2. **密钥存储实现不完整**
135+
- `store_key()``retrieve_key()` 只有占位实现
136+
- 缺少密钥序列化/反序列化逻辑
137+
138+
3. **CA 模块待验证** (依赖 RA 完成后)
139+
- 证书签发逻辑需要验证
140+
- 中间 CA 创建流程需要测试
141+
- 与 RA 的集成需要测试
142+
143+
4. **错误处理**
144+
- 统一错误处理机制
145+
- 更详细的错误信息
146+
147+
## 🏁 里程碑目标
148+
149+
- **里程碑 1**: RA 模块功能完善和验证完成 (PKI 入口就绪)
150+
- **里程碑 2**: CA 模块验证完成 (基于完善的 RA)
151+
- **里程碑 3**: 完整证书生命周期实现
152+
- **里程碑 4**: 生产就绪的 PKI 系统
153+
- **里程碑 5**: 性能优化和安全加固完成
154+
155+
---
156+
*最后更新: 2025-09-14*
157+
*优先级: RA模块完善 → CA模块验证 → 密钥存储完善 → 生命周期管理 → 高级功能*

crates/capsula-pki/src/lib.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ pub use keystore::{
5757
StorageBackend,
5858
};
5959
// Lifecycle 模块
60-
pub use lifecycle::{
61-
ChainValidator, LifecycleManager, LifecyclePolicy, ValidationResult,
62-
};
60+
pub use lifecycle::{ChainValidator, LifecycleManager, LifecyclePolicy, ValidationResult};
6361
pub use ra::{
6462
// CSR相关
6563
build_unsigned,
@@ -74,7 +72,6 @@ pub use ra::{
7472
verify_certificate,
7573
CertReqInfo,
7674
CertificateInfo,
77-
CertificateSigningRequest,
7875
CertificateSubject,
7976
Csr,
8077
CsrSubject,
@@ -111,7 +108,6 @@ pub mod prelude {
111108
create_self_signed_certificate,
112109
CertReqInfo,
113110
CertificateInfo,
114-
CertificateSigningRequest,
115111
CertificateSubject,
116112
Csr,
117113
CsrSubject,
Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,17 @@ use x509_cert::{
2020

2121
use crate::{error::PkiError, Result};
2222

23+
/// 公钥信息
24+
#[derive(Debug, Clone)]
25+
pub struct PublicKeyInfo {
26+
/// 算法标识符
27+
pub algorithm: String,
28+
/// 密钥大小(适用于RSA)
29+
pub key_size: Option<u32>,
30+
/// 公钥数据
31+
pub public_key_data: Vec<u8>,
32+
}
33+
2334
/// Certificate Signing Request (CSR) with Capsula Key integration
2435
#[derive(Debug, Clone)]
2536
pub struct Csr {
@@ -120,9 +131,6 @@ pub fn create_csr<K: Key + KeySign>(key: &K, subject: CsrSubject) -> Result<Csr>
120131
Csr::assemble(cert_req_info, &signature_bytes)
121132
}
122133

123-
/// Type alias for backward compatibility
124-
pub type CertificateSigningRequest = Csr;
125-
126134
impl Csr {
127135
/// Assemble a complete CSR from CertReqInfo and signature
128136
///
@@ -432,6 +440,43 @@ impl Csr {
432440
locality: None,
433441
}
434442
}
443+
444+
/// Get public key info for validation
445+
pub fn get_public_key_info(&self) -> Result<PublicKeyInfo> {
446+
let spki = &self.inner.info.public_key;
447+
448+
// 解析算法标识符
449+
let algorithm = match spki.algorithm.oid {
450+
const_oid::db::rfc8410::ID_ED_25519 => "Ed25519".to_string(),
451+
const_oid::db::rfc5912::ID_RSASSA_PSS => "RSA".to_string(),
452+
const_oid::db::rfc5912::RSA_ENCRYPTION => "RSA".to_string(),
453+
const_oid::db::rfc5912::ID_EC_PUBLIC_KEY => "ECDSA".to_string(),
454+
_ => format!("Unknown({})", spki.algorithm.oid),
455+
};
456+
457+
// 获取公钥数据
458+
let public_key_data = spki.subject_public_key.raw_bytes().to_vec();
459+
460+
// 对于 RSA,尝试估算密钥长度
461+
let key_size = if algorithm == "RSA" {
462+
// RSA 公钥的 DER 编码大小大致可以估算密钥长度
463+
// 这是一个粗略估算,实际密钥长度需要解析 ASN.1 结构
464+
match public_key_data.len() {
465+
200..=299 => Some(2048), // 2048位 RSA 公钥大约 270 字节
466+
300..=399 => Some(3072), // 3072位 RSA 公钥大约 390 字节
467+
400..=600 => Some(4096), // 4096位 RSA 公钥大约 550 字节
468+
_ => None,
469+
}
470+
} else {
471+
None
472+
};
473+
474+
Ok(PublicKeyInfo {
475+
algorithm,
476+
key_size,
477+
public_key_data,
478+
})
479+
}
435480
}
436481

437482
// Re-export CertReqInfo for external use in build_unsigned/assemble pattern

crates/capsula-pki/src/ra/mod.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,21 @@
55
//! - 身份认证(个人/设备/服务)
66
//! - 审批流程控制(手动/自动)
77
8-
pub mod csr;
8+
pub mod approval_workflow;
99
pub mod cert;
10-
pub mod request_handler;
10+
pub mod csr;
1111
pub mod identity_auth;
12-
pub mod approval_workflow;
12+
pub mod request_handler;
1313
pub mod validation;
1414

1515
// 重新导出CSR和证书相关类型
16-
pub use csr::{create_csr, CertificateSigningRequest, Csr, CsrSubject, CertReqInfo, build_unsigned};
1716
pub use cert::{
1817
create_certificate, create_self_signed_certificate, export_certificate, import_certificate,
1918
parse_certificate, sign_certificate, verify_certificate, CertificateInfo, CertificateSubject,
2019
X509Certificate,
2120
};
21+
pub use csr::{build_unsigned, create_csr, CertReqInfo, Csr, CsrSubject, PublicKeyInfo};
22+
pub use validation::{RequestValidator, ValidationPolicy, ValidationResult, ValidationSeverity, ValidationIssue};
2223

2324
use crate::error::Result;
2425

@@ -44,4 +45,4 @@ impl Default for RAConfig {
4445
max_pending_requests: 1000,
4546
}
4647
}
47-
}
48+
}

crates/capsula-pki/src/ra/request_handler.rs

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22
//!
33
//! 负责接收、验证和处理证书签名请求
44
5-
use crate::ra::csr::CertificateSigningRequest;
6-
use crate::error::{PkiError, Result};
75
use std::collections::HashMap;
86

7+
use crate::{
8+
error::{PkiError, Result},
9+
Csr,
10+
};
11+
912
/// 请求状态
1013
#[derive(Debug, Clone, PartialEq)]
1114
pub enum RequestStatus {
@@ -27,7 +30,7 @@ pub struct CsrRequest {
2730
/// 请求ID
2831
pub request_id: String,
2932
/// CSR内容
30-
pub csr: CertificateSigningRequest,
33+
pub csr: Csr,
3134
/// 请求状态
3235
pub status: RequestStatus,
3336
/// 提交时间
@@ -56,10 +59,10 @@ impl RequestHandler {
5659
}
5760

5861
/// 接收新的CSR请求
59-
pub fn receive_request(&mut self, csr: CertificateSigningRequest) -> Result<String> {
62+
pub fn receive_request(&mut self, csr: Csr) -> Result<String> {
6063
self.request_counter += 1;
6164
let request_id = format!("REQ-{:08}", self.request_counter);
62-
65+
6366
let request = CsrRequest {
6467
request_id: request_id.clone(),
6568
csr,
@@ -85,9 +88,11 @@ impl RequestHandler {
8588
status: RequestStatus,
8689
notes: Option<String>,
8790
) -> Result<()> {
88-
let request = self.pending_requests.get_mut(request_id)
91+
let request = self
92+
.pending_requests
93+
.get_mut(request_id)
8994
.ok_or_else(|| PkiError::NotFound(format!("Request {} not found", request_id)))?;
90-
95+
9196
request.status = status;
9297
request.updated_at = time::OffsetDateTime::now_utc();
9398
if let Some(notes) = notes {
@@ -96,4 +101,4 @@ impl RequestHandler {
96101

97102
Ok(())
98103
}
99-
}
104+
}

0 commit comments

Comments
 (0)