主题
sign-kms · 模块详解
本仓库 submodule:sign-kms/。本章引用的所有路径均为相对于该 submodule 根。
cmd/kms/
| 文件 | 关键符号 | 行号 |
|---|---|---|
main.go | main():flag→config→signet→wireApp→app.Run | 35, 76-126 |
wire.go | wireApp() providers | 24-32 |
main() 详细顺序见 核心流程 · Server 启动。
internal/conf/
| 文件 | 关键 message |
|---|---|
conf.proto | Bootstrap(8-13)、Server(55-66:network/addr/timeout/http_addr/web_dist_path/tls/https)、TLS(68-78)、Data(80-86)、HSM(51-53)、HSMProvider(39-49)、Observability(15-24,含 Metrics/Tracing/Logging 子 message 26-37) |
make config 生成 conf.pb.go。
internal/server/
| 文件 | 关键符号 | 行号 |
|---|---|---|
grpc.go | NewGRPCServer、中间件链 recovery → signet → GrpcAuthMiddleware → audit、RegisterKmsServiceServer | 23-56, 26-28, 54 |
grpc.go | mTLS 配置(条件 Tls.Enable=true && CaFile 非空) | 44-51, 82 |
http.go | NewHTTPServer、中间件 recovery → signet → logging、HttpAuthMiddleware、RegisterKmsManageServiceHTTPServer、obs.RegisterRoutes | 45-98, 49-51, 56, 70, 73 |
http.go | 静态文件(嵌入式 + SPA fallback) | 22-43, 76-95 |
internal/service/
| 文件 | RPC 方法 | 行号 |
|---|---|---|
kms_service.go | GenerateKeypair、GetPublicKey、Sign、Verify、HealthCheck | 20-29 / 31-40 / 42-60 / 62-78 / 80 |
kms_manage_service.go | Signin、Signout、Current、CreateNs、GetAccessToken(共 14 个 RPC) | 26-47 / 49-59 / 61-67 / 69-86 / 88-102 |
完整 HTTP RPC 列表见 06-api · HTTP 端点。
internal/biz/
kms_biz.go
来源:internal/biz/kms_biz.go。
| 方法 | 行号 |
|---|---|
NewKmsBiz | 42 |
partitionMu(per-partition mutex) | 51 |
resolveNamespace(缓存 + DB 查询) | 58 |
invalidateNamespace | 73 |
getSession(从分区 pool 借会话) | 79 |
getProviderContext | 105 |
CloseAllSessions | 118 |
PoolStatus | 123 |
GenerateKeyPair | 143 |
GenerateKeyPairForPartition | 161 |
Sign | 268 |
Verify | 320 |
GetPublicKey | 373 |
GenerateKeyPairForPartition 核心步骤(:161-264):
- per-partition mutex 锁(
:170-172) - 重试最多 3 次,失败丢弃坏会话(
:192-213) - 公钥字节提取(
:218)→ raw EC 点 →sha256→finalIdhex(:226-232) - 设置
CKA_LABEL = CKA_ID = finalId(:234-244) - DB 落盘:
algorithm=EC、curve=P-256、可选tag(:246-261)
kms_manage_biz.go
来源:internal/biz/kms_manage_biz.go。
| 方法 | 行号 |
|---|---|
NewKmsManageBiz | 45 |
CreateNs(路由到 soft / hardware) | 54 |
createSoftNs | 69 |
createHardwareNs | 110 |
ListProviders | 206 |
GetAccessToken | 212 |
GetNamespaceInfo | 295 |
ListNamespaces | 323 |
CreateKey | 377 |
SyncKeys | 404 |
ListAccessTokens | 495 |
DisableAccessToken | 509 |
EnableAccessToken | 516 |
UpdateAccessTokenKeys | 541 |
ListKeys | 565 |
ValidateCredentials | 582 |
Token 签发关键步骤(GetAccessToken,:251-279):
tokenID = "at_" + 12 位随机字母数字(:254)- 先写
AccessTokenDB(DB 是权威),再签 JWT(:258-266) - JWT claims 含
ID (JTI)、Subject、IssuedAt、ExpiresAt、PartitionID = ns.TokenLabel、Role、Keys(:270-279)
其它
| 文件 | 用途 |
|---|---|
biz.go | ProviderSet:NewKmsBiz、NewObservableKmsBiz、NewKmsManageBiz |
kms_observable.go | ObservableKmsBiz 包装 KmsBiz,叠加 OTEL 指标;KmsService 依赖此对象(NewObservableKmsBiz:30) |
SKI 推导(extractRawECPoint / getPublicKeyBytes)在 kms_biz.go 内,单测见 ski_test.go。
internal/data/
Repository 模式包装 Ent client。
Ent schema(internal/data/ent/schema/)
| 文件 | 实体 | 行号 |
|---|---|---|
namespace.go | Namespace(id / name / token_label / user_pin / so_pin / provider_id / description / 时间戳) | 18-51 |
keypair.go | Keypair(id / tag / algorithm / curve / public_key / public_key_pem / key_type / status / namespace_id / metadata / 时间戳) | 30-75 |
user.go | User(username / password_hash / is_active / 时间戳) | 15-25 |
access_token.go | AccessToken(id=JTI / subject / role / keys / status / namespace_id / expires_at / 时间戳) | 25-57 |
关键设计点:
Keypair.id由服务器从公钥点sha256推导(keypair.go:18-23),既是主键也是 HSMCKA_LABEL/CKA_ID。AccessToken.keys第 37-39 行注释明确:DB 是权威源,JWT 中的 keys 仅供参考;DB 修改可立即在下次请求生效(由pkg/auth/grpc_auth.go:62-74覆盖)。
初始化
| 文件 | 用途 |
|---|---|
init_user.go | 首次启动管理员账号(读 DEFAULT_ADMIN_PWD env) |
pkg/pkcs11/
| 文件 | 关键符号 | 行号 |
|---|---|---|
registry.go | ProviderInstance、ProviderRegistry、NewProviderRegistry、register | 14-26 / 60-64 / 68-92 / 102 |
session_pool.go | SessionPool、PoolStatus、NewSessionPool、DefaultPoolSize=5、MaxPoolSize=30、HealthCheckInterval=30s | 24-41 / 44-50 / 54-95 / 18-20 |
Borrow / Return / Discard / WarmupHandleCache 具体行号 [未核]。
pkg/auth/
| 文件 | 关键符号 | 行号 |
|---|---|---|
claims.go | KMSClaims、RoleReadonly、RoleReadWrite、RoleAdmin、roleOps、RoleAllows | 11-22 / 26-28 / 42-46 / 49 |
grpc_auth.go | GrpcAuthMiddleware、token 解析、TokenStore.GetByJTI 覆盖 keys | 48 / 49-80 / 62-74 |
http_auth.go | HttpAuthMiddleware、白名单 /api/v1/signin | 27 / 28-56 |
config.go | CookieName、GetAuthSecret(未设置 panic)、DefaultExpiry=24h、DefaultTokenExpiry=365d、MaxTokenExpiry=730d | 15 / 38, 44 / 55 / 58 / 60 |
api/v1/
| 文件 | service | RPC |
|---|---|---|
kms.proto | KmsService(行 7-13) | GenerateKeypair、GetPublicKey、Sign、Verify、HealthCheck(行 8-12) |
manage.proto | KmsManageService(行 11-81) | 14 个 RPC(含 google.api.http 注解) |
完整 HTTP 路径与请求类型见 06-api · HTTP 端点。
p11client/
来源:p11client/。
| 文件 | 用途 |
|---|---|
kms_so.c | PKCS#11 代理实现,定义完整函数表(69 个 C_* 函数) |
grpc_client_helper.c / .h | gRPC 客户端辅助 |
proto/kms.pb-c.c / .h | protobuf-c 生成 |
include/pkcs11.h / pkcs11t.h / pkcs11f.h | PKCS#11 标准头 |
test_pkcs11.c / simulation_test.c / known_key_test.c | 测试 |
kms_so.c 定义了 PKCS#11 全套 69 个 C_* 函数。其中与 KMS 操作相关的为实质实现,按源码顺序:C_Initialize / C_Finalize / C_GetInfo / C_GetFunctionList / C_GetSlotList / C_GetSlotInfo / C_GetTokenInfo / C_GetMechanismList / C_GetMechanismInfo / C_InitToken / C_InitPIN / C_SetPIN / C_OpenSession / C_CloseSession / C_CloseAllSessions / C_GetSessionInfo / C_Login / C_Logout / C_GenerateKeyPair / C_GetPublicKey / C_SignInit / C_Sign / C_GetAttributeValue / C_SetAttributeValue / C_FindObjectsInit / C_FindObjects / C_FindObjectsFinal / C_VerifyInit / C_Verify。其余函数(加解密、摘要、Wrap/Unwrap、随机数等)为桩实现,返回 CKR_FUNCTION_NOT_SUPPORTED。
环境变量(kms_so.c):
KMS_SO_DEBUG(:39)SIGN_KMS_ENDPOINT(:202)
web/
| 项 | 值 |
|---|---|
| 框架 | React 19.2.0、React Router 7.10.1 |
| 样式 | Tailwind CSS 4.1.18(via @tailwindcss/vite) |
| UI | shadcn/ui(Radix + Tailwind) |
| 构建 | rolldown-vite 7.2.5 |
Scripts(package.json) | dev、build、lint、preview、ui |
scripts/
| 脚本 | 用途 |
|---|---|
init-softhsm.sh | 创建 7 个测试 partition + EC P-256 密钥(见 03-quickstart) |
docs/
来源:docs/ 目录。
design-multi-hsm-provider.md— HSM Provider 层多后端支持设计design-p11client-v2.md— PKCS#11 代理库设计grafana/sign-kms-overview.json— Grafana 仪表板定义
具体设计文档内容 [未核]。
看代码推荐路径
cmd/kms/main.go→wire.go了解依赖链。internal/server/grpc.go+http.go→ 看中间件链与服务注册。- 任选一个端到端:
internal/service/kms_service.go:Sign→internal/biz/kms_biz.go:Sign(268)→getSession(79)→pkg/pkcs11/session_pool.go:Borrow。 - 管理面:
internal/service/kms_manage_service.go:GetAccessToken→internal/biz/kms_manage_biz.go:GetAccessToken(212)。 pkg/auth/grpc_auth.go:48-80→ 看 JWT 解析与 DB 覆盖。internal/data/ent/schema/*.go→ DB 实体定义。p11client/kms_so.c→ 想懂客户端.so时再读。