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>
This commit is contained in:
zuevav
2026-05-13 22:48:21 +03:00
parent d5b5597c67
commit 3fdc526031
8 changed files with 1651 additions and 0 deletions
+166
View File
@@ -0,0 +1,166 @@
# 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`:
```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 — «выполнено».