CertifiEd

Документация CertifiEd

CertifiEd — платформа криптографического лицензирования для on-prem ПО. Лицензия это самодостаточный токен, подписанный Ed25519: приложение проверяет его локально, без обращения к серверу. Ниже — карта разделов и архитектурная выжимка.

Задача

On-prem ПО, поставляемое клиентам, нуждается в защите от нелицензионного использования — без постоянного доступа в интернет и без передачи контроля в чужие облака.

Как устроено решение

CertifiEd выпускает криптографически подписанные лицензии (Ed25519). Конфигурация продукта — feature flags и лимиты — живёт внутри подписанного токена, а не отдаётся через API: клиентское приложение валидирует лицензию локально по публичному ключу и работает оффлайн до 30 дней.

  • Self-hosted полностью. PostgreSQL, MinIO, observability — на своих серверах. Никаких Cloud KMS, managed-сервисов и SaaS-биллеров.
  • Multitenant с первого дня. Дерево компаний произвольной глубины (ltree): корень — прямой клиент, потомки — суб-клиенты и реселлеры. Роль, выданная на узле, действует на всё поддерево.
  • Оффлайн — норма. Heartbeat желателен, но не обязателен; grace-период до 30 дней.
  • Аудит всего. Каждая мутация попадает в audit_log.

Роли и скоупы

РольСкоуп
OperatorГлобальный (сотрудник Ofarandagon)
Owner / Admin / ViewerКомпания и всё её поддерево

Глоссарий

ТерминЗначение
Шаблон (LicenseTemplate)Продукт; версии шаблона несут JSON Schema конфигурации
ЛицензияВыпущенный подписанный экземпляр для компании; ключ CFED-…, файл .ced
АктивацияПривязка лицензии к HW fingerprint
HeartbeatПериодический check-in клиентского приложения

Архитектура

Монолит с чистыми границами — Clean Architecture, слои зависят строго в одну сторону.

text
SharedKernel <- Domain <- Application <- Infrastructure <- Api                                                   <- Client (SDK, token format only)
  • SharedKernelResult<T>, Error, примитивы. Без зависимостей.
  • Domain — сущности, enums, value objects. Без зависимостей.
  • Application — use-cases, интерфейсы (ISigner, репозитории), DTO.
  • Infrastructure — EF Core (Npgsql, snake_case, ltree), EncryptedFileSigner, WebhookDispatchWorker, SMTP.
  • Api — ASP.NET Core; два контура в одном процессе.
  • Client — SDK, зависит только от формата токена.

Два контура API

КонтурПрефиксАутентификацияRate limit
Panel API/api/v1/panel/*cookie certified.auth либо PAT Authorization: Bearer300 req/мин на IP
Client API/api/v1/client/*публичный; мутации подписываются HMAC100 req/мин на IP

Подробности — в разделе API Reference.

Подпись и ключи

  • Ed25519-keypair на каждый шаблон (NSec.Cryptography).
  • Приватные ключи лежат в файлах, зашифрованных AES-256-GCM; master key — переменная окружения CERTIFIED_MASTER_KEY.
  • Ротация: новый ключ становится active, старый — rotating, затем retired. При компрометации ключ помечается compromised, лицензии перевыпускаются.

Данные, фоновые задачи, observability

  • PostgreSQL 16: UUIDv7, timestamptz, jsonb, ltree (companies.path) для запросов по поддереву. Heartbeats — кандидат на партиционирование по месяцам.
  • Фоновые BackgroundService-воркеры (без Hangfire в v1): доставка webhooks с ретраями и подписью X-CertifiEd-Signature, истечение лицензий, очистка heartbeats.
  • Serilog (compact JSON) + OpenTelemetry (traces/metrics, OTLP опционально); health-эндпоинты /health, /health/live, /health/ready.

Развёртывание

text
[Caddy / nginx: TLS]   |-- panel.certified.example    -> panel static build   |-- portal.certified.example   -> customer portal   |-- certified.example          -> landing static build   `-- api.certified.example      -> CertifiEd.Api (Kestrel)
[PostgreSQL 16]   [MinIO: backups/export]   [Redis: optional]   [SMTP]

Cloudflare — только edge (TLS / WAF / DNS), без Workers и KV. Всё состояние остаётся в вашем контуре.

Переменные окружения

ПеременнаяНазначение
CERTIFIED_MASTER_KEYbase64, 32 байта — ключ шифрования приватных ключей подписи
CERTIFIED_KEYS_DIRДиректория зашифрованных ключей — обязательно в бэкап
CERTIFIED_CORS_ORIGINSOrigins панели и кабинета клиента
ConnectionStrings__DefaultСтрока подключения к PostgreSQL

Чек-лист прода

  • Бэкапы PostgreSQL (pg_dump + WAL) и CERTIFIED_KEYS_DIR.
  • Смена seed-пароля оператора.
  • Rate limiting включён: client 100/мин, panel 300/мин.
  • OTLP направлен в собственный Grafana-стек, настроен алертинг.
  • Партиционирование heartbeats при росте объёма.

Куда дальше