Перейти к содержанию

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 (сейчас сессия в памяти).
  • Расширить панель (входящие запросы на подпись, настройки).