- services/crypto-service/proto/crypto.proto — protobuf-контракт VerifyXMLDSig/SignXMLDSig/Health, package ru.zetit.bridgeandjoins.crypto.v1
- services/crypto-service/build.gradle.kts — Gradle Java 21 + protobuf-плагин + shadowJar
- services/crypto-service/src/main/java/.../CryptoServer.java — точка входа на UDS (Netty Epoll)
- services/crypto-service/src/main/java/.../CryptoServiceImpl.java — gRPC-биндинг
- services/crypto-service/src/main/java/.../{Verify,Sign,Health}Handler.java — заглушки операций
- services/crypto-service/src/main/java/.../KeystoreProvider.java — абстракция cryptopro/validata/vipnet/stub
- services/crypto-service/Dockerfile — Liberica JDK 21 → shadowJar → slim
- internal/cryptocli/client.go — Go-клиент по UDS, реализует m2mcore.CryptoVerifier (M1 stub)
- internal/cryptocli/client_test.go — тесты на доступность сокета и ErrNotImplemented
- deploy/docker-compose/docker-compose.yml — добавлен сервис crypto-service с UDS-volume
Реальная криптография КриптоПро JCP подключается после получения
лицензии и jar (положить в services/crypto-service/libs/jcp.jar) и
открытия Maven Central через прокси zetit (для grpc-java/santuario).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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-packagecryptopb, Java-packageru.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
(чтобы отличать «сокет недоступен» от «криптография не подключена»).