eID 双证书 —— 生产环境验证(2026-06-18)¶
Smart-ID / eIDAS 模型的全部核心流程,均已在真实 iPhone + staging 后端 (rp-api.eidmongolia.mn)上完成端到端验证。
已验证的流程¶
| 流程 | 密钥 / PIN | 证书 | 验证依据 |
|---|---|---|---|
| 注册(DAN KYC → 活体检测 → 分布式密钥生成 → 2 份证书) | sign + auth | SIGN + AUTH | 真机:users(civil_id)、2 份 ACTIVE 证书、设备(has_sign+has_auth) |
| 登录(网页登录,二维码) | PIN1 · 身份认证 | clientAuth | 网页显示 “Successfully logged in” + 身份信息 |
| 合同签署(网页签名,二维码) | PIN2 · 签名 · 不可否认 | QUALIFIED | 网页显示 “Signed the contract”,COMPLETE/OK |
关键架构决策¶
- 双密钥、双证书。 每位公民拥有两把相互独立的门限 ECDSA 密钥:身份认证
(PIN1、
clientAuth、登录)与签名(PIN2、contentCommitment不可否认、 具备法律效力的签名)。一部手机、一个documentNumber、两个 Keychain 槽位。 注册时执行 2 次密钥生成(通过预热加速)、签发 2 份证书;签名 / 认证流程各自加载 对应的密钥(后端credentialFor(flow),iOSapprove(authentication:))。 - 身份标识 = civil_id。 证书 / etsi 形如
PNOMN-<civil_id>(仅数字)。 登记号(РД,西里尔字母 “МА…”)不会写入证书 —— 它是独立属性。DAN 回调会发送 civil_id + reg_no + 图像 + 身份信息。出生日期与性别写入 SDA 扩展(RFC 3739)。 - DAN 安全绑定。 dan.gerege.mn 的回调不发送
state(仅有 reg_no), 因此将 state 嵌入 callback_url,使回调可靠地绑定到具体会话 (reg_no 仅作交叉校验)—— 从而避免身份被劫持的竞态问题。 - 活体检测。 DAN 底照与自拍照通过 InsightFace ArcFace(buffalo_l)服务比对
(
/v1/compare,余弦相似度 ≥ 0.6)。iOS 使用完整相机(Vision,配合 DAN 取景框)。
组件¶
- 后端(Go):
service/dan(KYC + 活体 + 照片)、crypto/ca(Profile + SDA)、service/memory/crypto_wired(双密钥注册、符合外键约束的顺序)、domain(User/KYC 状态机)。 - iOS(Swift SDK + SwiftUI):DAN 参考界面(手机号→DAN→活体→PIN×2→密钥生成)、
双密钥
enroll、FaceVerify(ArcFace,百分比)、RoundTripOverlay、主控制台。 - Web(Next.js RP 演示):登录(auth)与签名(PIN2)流程。
- Staging 部署与运维要点:
deploy/、memory/staging-ops-gotchas。
上线前待办(TODO)¶
- 基于 HSM 的 CA(当前 staging 使用临时自签名)——
docs/PKI_CA_ONBOARDING.md。 - 组织 / 法人(NTRMN-)注册。
- Postgres:dan_replay_cache、PII 定期清理(当前会话保存在内存中)。
- 完善控制台(待签名收件箱、设置项)。