Files
zuevav 9737c787f9 feat: живой цикл M2M с НРД + мастер установки ключа на флешку
Инфраструктура 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>
2026-06-19 00:03:21 +03:00
..

services/crypto-service — крипто-сервис на Java + КриптоПро JCP

gRPC-сервис криптографических операций по ГОСТ Р 34.10-2012:

  • проверка XMLDSig-подписи входящих квитанций НРД, ответов брокеров, заявлений ЛК;
  • серверная подпись действий оператора (admin-ui, SLA 2 мин);
  • резервный канал в НРД через WS ONYX напрямую (когда ИШ не задействован — упаковка и подпись на нашей стороне);
  • криптографические проверки целостности эталонов в MinIO.

Слушает Unix Domain Socket (/run/bj/crypto.sock по умолчанию, переопределяется через BJ_CRYPTO_SOCKET). gRPC по UDS — без сетевого хопа, минимальная задержка.

Стек: Java 21 (Liberica JDK), Apache Santuario с ГОСТ-патчем, КриптоПро JCP. Класс СКЗИ — КС1 (программная защита, без HSM).

Состав

  • proto/crypto.proto — protobuf-контракт: VerifyXMLDSig, SignXMLDSig, Health. Go-package cryptopb, Java-package ru.zetit.bridgeandjoins.crypto.v1.
  • build.gradle.kts — Gradle сборка с протобуф-плагином и shadowJar.
  • src/main/java/.../CryptoServer.java — точка входа, поднимает gRPC на UDS (Netty Epoll). Перед стартом удаляет старый сокет.
  • src/main/java/.../CryptoServiceImpl.java — gRPC-биндинг, делегирует на хендлеры.
  • src/main/java/.../VerifyHandler.java, SignHandler.java, HealthHandler.java — реализации операций (на M1 заглушки).
  • src/main/java/.../KeystoreProvider.java — provider-абстракция (cryptopro | validata | vipnet | stub). Архитектурно сохранена для тиражирования другим компаниям.
  • Dockerfile — Liberica JDK 21 → shadowJar → slim-image, запуск под bj-crypto (uid 1100).

Состояние

На M1 — только скелет. Реальная криптография подключается, когда заказчик предоставит:

  • лицензию и jar КриптоПро JCP (положить в libs/jcp.jar);
  • доступ к Maven Central через прокси zetit для скачивания grpc-java, protobuf-java, Apache Santuario.

После этого VerifyHandler и SignHandler реализуются через Apache Santuario с ГОСТ-патчем (см. TODO в коде).

Запуск (после подключения зависимостей)

./gradlew shadowJar
java -jar build/libs/crypto-service-0.1.0-all.jar

Или в docker-compose:

podman-compose -f deploy/docker-compose/docker-compose.yml up crypto-service

Go-клиент

internal/cryptocli/ — реализация m2mcore.CryptoVerifier по UDS. На M1 проверяет доступность сокета и возвращает ErrNotImplemented (чтобы отличать «сокет недоступен» от «криптография не подключена»).