# 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 в коде). ## Запуск (после подключения зависимостей) ```bash ./gradlew shadowJar java -jar build/libs/crypto-service-0.1.0-all.jar ``` Или в docker-compose: ```bash podman-compose -f deploy/docker-compose/docker-compose.yml up crypto-service ``` ## Go-клиент `internal/cryptocli/` — реализация `m2mcore.CryptoVerifier` по UDS. На M1 проверяет доступность сокета и возвращает `ErrNotImplemented` (чтобы отличать «сокет недоступен» от «криптография не подключена»).