Инфраструктура M2M (живой обмен с НРД через ИШ): - обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение ответа; INFO → ждём Decision; идемпотентность поллера - fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO - сырой XML ответа НРД в карточке заявки (для пересылки в ТП) - тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes, 4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта - редирект из теста сразу в карточку заявки Мастер установки ключа Валидаты на флешку (admin/setup/keywizard): - пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник сертификатов (CRL) → перезапуск+проверка ИШ → готово - привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен, bj-server остаётся в песочнице - сохранение структуры профиля архива (spr<N>), перечисление съёмных USB Прочее: - пакет-доказательство для ТП НРД + форма регистрации участника M2M - эталонные образцы робота (DOC/m2m_robot_samples) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Лицензирование Bridge-and-Join-s (#19)
Годовые лицензии с офлайн-проверкой по подписи Ed25519 + опциональный онлайн-отзыв.
Компоненты
internal/license— формат лицензии + подпись/проверка (offline).cmd/bj-license— издательский CLI: keygen, issue, verify.cmd/bj-license-server— онлайн-реестр отзывов (revocation).- Интеграция в bj-server:
internal/lkgateway/licensecheck.go— проверка лицензии + гейт обновлений; UI раздел «Лицензия».
Модель
Лицензия — самодостаточный подписанный токен: payload.signature.keyid.
bj-server проверяет подпись зашитым публичным ключом и срок офлайн —
работает без связи с сервером. Online-сервер нужен только для отзыва.
Гейт обновлений: если лицензирование включено (есть публичный ключ),
авто-обновление (#20) выполняется только при валидной лицензии с фичей
updates. Без лицензирования (публичный ключ не зашит) — открытый режим,
гейты не действуют (бесплатная редакция / разработка).
Издателю
# 1. Ключи лицензий (однократно; приватный — в секрете!)
bj-license keygen -out ./keys/license
# публичный base64 — зашить в bj-server (DefaultLicensePublicKey)
# 2. Выпустить годовую лицензию клиенту
bj-license issue -tenant "ООО Ромашка" -plan pro -days 365 \
-features updates,web-cabinet -key ./keys/license.priv -keyid main
# → выводит ключ payload.signature.keyid — отдать клиенту
# 3. Проверить
bj-license verify -key-file license.key -pub ./keys/license.pub
Планы: free (без фич), pro (перечисленные features), enterprise
(всё включено). Фичи: updates, web-cabinet, …
Клиенту (on-prem bj-server)
Админ → Настройка → Лицензия → вставить ключ → «Активировать». Проверка офлайн; статус (организация, план, срок, обновления) виден сразу.
Онлайн-отзыв (опционально)
bj-license-server --addr :8091 --revoked /var/lib/bj-license/revoked.json
revoked.json — JSON-массив отозванных license ID:
["28db4973-fde8-434c-b102-e83623eede2c"]
GET /v1/check?id=<id> → {"revoked":true|false}. Перечитывается раз в
минуту. В проде заменить файл на PostgreSQL + admin API выпуска/отзыва.
Зашивка публичного ключа в релиз
go build -ldflags "\
-X .../lkgateway.DefaultLicensePublicKey=<base64-pub> \
-X .../lkgateway.DefaultUpdatePublicKey=<base64-pub-артефактории> \
-X .../lkgateway.BuildVersion=1.0.0" -o bj-server ./cmd/bj-server/