Files
Bridge-and-Join-s/docs/tasks/PR-6-crypto-service-skeleton.md
zuevav 3fdc526031 docs: план проекта + промпты задач PR-1..PR-6 для Claude Code на ВМ
- 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>
2026-05-13 22:48:21 +03:00

6.6 KiB
Raw Permalink Blame History

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 — «выполнено».