- docs/architecture/plan.md — полный план проекта (архитектура, стек, SLA, регуляторика, Реестр ПО, roadmap M1–M5, открытые вопросы и решения). - docs/tasks/README.md — индекс задач и инструкция запуска для Claude Code на dev-ВМ. - docs/tasks/PR-1-go-models-m2m.md — Go-модели M2M, парсер windows-1251, NSDDateTime, round-trip тесты на эталонах. - docs/tasks/PR-2-fansy-ddl.md — DDL принимающей БД для команды Fansy (контракт данных, ETL-требования, словарь полей, тестовые данные). - docs/tasks/PR-3-lk-openapi.md — OpenAPI контракт lk-gateway по ESIA Finance API V1, для синхронизации с командой ЛК. - docs/tasks/PR-4-m2m-core-skeleton.md — FSM сделки, репозиторий, идемпотентность по GUID, метрики SLA. - docs/tasks/PR-5-nsd-adapter-skeleton.md — REST-клиент ИШ НРД, маршрутизация типов пакетов (M2MTR/M2MTD/M2MER/SUBBR/SUBER/SUB16). - docs/tasks/PR-6-crypto-service-skeleton.md — gRPC-каркас Java-сервиса криптографии (КриптоПро JCP, UDS, Provider-абстракция). С этого коммита дальнейшая разработка идёт на dev-ВМ через запущенный там Claude Code. Промпты PR-1..PR-3 готовы к параллельному запуску; PR-4 после PR-1; PR-5 и PR-6 ждут поставку артефактов (ИШ НРД, сертификаты, КриптоПро JCP). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
6.6 KiB
PR-6: Каркас crypto-service — Java + КриптоПро JCP, gRPC по UDS
Цель
Реализовать сервис криптографических операций по ГОСТ:
- проверка подписи входящих квитанций ЭДО, ответов НРД и сообщений от брокеров;
- серверная подпись действий оператора в
admin-ui(ради соблюдения SLA 2 мин); - резервный канал отправки в НРД через WS ONYX напрямую (когда ИШ не задействован — упаковка и подпись на нашей стороне);
- криптографические проверки целостности эталонов в MinIO.
Зависимости
- PR-1 (Go-модели).
- PR-4 (
m2m-core— реализуемCryptoVerifier). - Внешние: лицензия и дистрибутив КриптоПро CSP + JCP под РЕД ОС.
Состояние блокеров
Этот PR можно начать только после:
- получены лицензии КриптоПро CSP и JCP;
- установлен КриптоПро CSP на dev-ВМ;
- доступны тестовые ключевые контейнеры.
До этого — заглушка с gRPC-протоколом, без реальной криптографии.
Источники
docs/architecture/plan.md— раздел «Криптография: Go + ГОСТ» и «Подпись действий оператора».- Документация КриптоПро JCP.
- Apache Santuario (XMLDSig).
Состав PR
1. gRPC-протокол
services/crypto-service/proto/crypto.proto:
syntax = "proto3";
package bridge_and_joins.crypto.v1;
service CryptoService {
// Проверка подписи XMLDSig в пакете ЭДО.
rpc VerifyXMLDSig(VerifyRequest) returns (VerifyResponse);
// Подпись XML по ГОСТ — для резервного канала WS ONYX и для
// действий оператора.
rpc SignXMLDSig(SignRequest) returns (SignResponse);
// Health-check.
rpc Health(HealthRequest) returns (HealthResponse);
}
message VerifyRequest {
bytes payload = 1; // XML с подписью
string profile = 2; // "guest-gost" | "test3-gost" | "prod-gost" | ...
}
message VerifyResponse {
bool valid = 1;
string signer_cn = 2; // CN из сертификата
string signer_inn = 3; // ИНН из сертификата (если есть)
string serial = 4;
int64 not_before = 5; // unix epoch
int64 not_after = 6;
repeated string errors = 7;
}
message SignRequest {
bytes payload = 1; // канонизированный XML
string key_alias = 2; // алиас ключа в JCP-keystore
string profile = 3;
}
message SignResponse {
bytes signed_xml = 1;
}
2. Java-проект
Структура:
services/crypto-service/
├── build.gradle.kts — Gradle с Liberica JDK 21
├── src/main/java/.../CryptoServer.java — main, gRPC сервер
├── src/main/java/.../VerifyHandler.java — Santuario verify
├── src/main/java/.../SignHandler.java — Santuario sign
├── src/main/java/.../KeystoreProvider.java — Provider-абстракция
│ (КриптоПро / Валидата / ...)
└── src/test/java/.../*Test.java
Зависимости:
- gRPC Java + protoc-gen-java,
- Apache Santuario с ГОСТ-патчем,
- КриптоПро JCP (jar поставляется заказчиком вместе с лицензией).
3. Бинд на UDS
Сервер слушает Unix Domain Socket по пути из конфига (/run/bj/crypto.sock),
а не TCP — минимальная задержка, изоляция от сети.
4. Provider-абстракция
KeystoreProvider — интерфейс с реализациями CryptoProJcpProvider,
ValidataJcpProvider (заглушка), VipNetProvider (заглушка). Выбор —
через конфиг (env: BJ_CRYPTO_PROVIDER=cryptopro).
5. Go-клиент
internal/cryptocli/client.go:
Клиент gRPC по UDS, реализует m2mcore.CryptoVerifier. Используется
из lk-gateway (верификация заявления), m2m-core (верификация
квитанций НРД), nsd-adapter/onyx (подпись для резервного канала).
6. Тесты
- Юнит-тесты Java на эталонах: подпиши тестовым ключом → провер'
→ должен быть
valid=true. - Юнит-тесты Go-клиента на mock-сервере gRPC.
- Интеграционный тест (помечен
//go:build integration): запускает crypto-service как процесс и проверяет подпись/проверку эталонной квитанции.
7. Сборка и упаковка
Dockerfileдляcrypto-service(Liberica JDK 21 base).- Подключение к
deploy/docker-compose/docker-compose.yml(mount UDS как volume).
Требования
- Закрытые ключи КриптоПро никогда не логируются и не выгружаются через API. Только handle на keystore.
- Каждая операция подписи — аудит-запись в журнале (
audit.logили отдельный gRPC stream): кто (оператор/системный ключ), что подписано (sha256 от payload), когда. - Без эмодзи.
Коммит
feat(crypto-service): gRPC-каркас сервиса криптографии (КриптоПро JCP)
- services/crypto-service/proto/crypto.proto — protobuf-контракт
- services/crypto-service/ — Java 21 + gRPC, заглушки Verify/Sign
- internal/cryptocli/ — Go-клиент по UDS, реализует CryptoVerifier
- deploy/docker-compose/docker-compose.yml — подключение сервиса
Реальная подпись КриптоПро подключается после получения лицензии и
ключевых контейнеров от заказчика.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
После коммита
Обновить docs/tasks/README.md: PR-6 — «выполнено».