跳转至

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),iOS approve(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 定期清理(当前会话保存在内存中)。
  • 完善控制台(待签名收件箱、设置项)。