eID 2 сертификата — проверка в продуктивном окружении (2026-06-18)¶
Все основные сценарии модели Smart-ID / eIDAS проверены сквозным прогоном на реальном iPhone + staging-бэкенде (rp-api.eidmongolia.mn).
Проверенные сценарии¶
| Сценарий | Ключ / PIN | Сертификат | Подтверждение |
|---|---|---|---|
| Регистрация (DAN KYC → liveness → распределённая генерация ключей → 2 сертификата) | sign + auth | SIGN + AUTH | Реальный телефон: users (civil_id), 2 сертификата ACTIVE, устройство (has_sign+has_auth) |
| Вход (веб-логин, QR) | PIN1 · аутентификация | clientAuth | Веб: «Successfully logged in» + идентичность |
| Подписание договора (веб-подпись, QR) | PIN2 · подписание · неотказуемость | QUALIFIED | Веб: «Signed the contract», COMPLETE/OK |
Ключевые архитектурные решения¶
- Два ключа, 2 сертификата. У каждого гражданина ДВА независимых пороговых ключа ECDSA:
аутентификация (PIN1,
clientAuth, вход) и подписание (PIN2, неотказуемостьcontentCommitment, юридически значимая подпись). Один телефон, одинdocumentNumber, два слота в Keychain. Регистрация: 2 генерации ключей (ускоряются прогревом), 2 сертификата; сценарии подписания/аутентификации загружают соответствующий ключ (credentialFor(flow)на бэкенде,approve(authentication:)в iOS). - Идентичность = civil_id. Сертификат/etsi имеет вид
PNOMN-<civil_id>(только цифры). Регистрационный номер (РД, кириллица «МА…») в сертификат НЕ попадает — это отдельный атрибут. Callback DAN присылает civil_id + reg_no + изображение + идентичность. Дата рождения и пол попадают в расширение SDA (RFC 3739). - Безопасная привязка DAN. Callback dan.gerege.mn не присылает
state(только reg_no), поэтому state встраивается в callback_url, и callback надёжно связывается с конкретной сессией (reg_no служит лишь перекрёстной проверкой) — это исключает гонку с перехватом идентичности. - Liveness. Эталонное фото DAN и селфи сравниваются сервисом InsightFace ArcFace (buffalo_l)
(
/v1/compare, косинусная мера ≥ 0.6). iOS использует полноценную камеру (Vision, с кадрированием DAN).
Компоненты¶
- Бэкенд (Go):
service/dan(KYC + liveness + фото),crypto/ca(Profile + SDA),service/memory/crypto_wired(регистрация с двумя ключами, корректный порядок FK),domain(FSM User/KYC). - iOS (Swift SDK + SwiftUI): эталонные экраны DAN (телефон→DAN→liveness→PIN×2→генерация ключей),
enrollс двумя ключами, FaceVerify (ArcFace, %), RoundTripOverlay, главная панель. - Web (RP-демо на Next.js): сценарии входа (auth) и подписания (PIN2).
- Деплой staging + эксплуатационные заметки:
deploy/,memory/staging-ops-gotchas.
Остаётся сделать для продакшена (TODO)¶
- CA на базе HSM (сейчас в staging — эфемерный самоподписанный) —
docs/PKI_CA_ONBOARDING.md. - Регистрация организаций / юридических лиц (NTRMN-).
- Postgres: dan_replay_cache, регулярная очистка PII (сейчас сессия в памяти).
- Расширить панель (входящие запросы на подпись, настройки).