2e09e21ad6
Заменили stub-клиент на полноценный PKCS#11 wrapper через
github.com/miekg/pkcs11. Поддерживает любой PKCS#11-совместимый
провайдер: КриптоПро CSP (libcppkcs11.so), Рутокен ЭЦП 2.0
(librtpkcs11ecp.so), Валидата, ViPNet и др.
internal/cryptocli/client.go:
- cryptocli.Client с конфигом {Provider, ModulePath, PIN, SlotID}
- Health() — Initialize → GetInfo → GetSlotList(WithToken=true) →
GetTokenInfo для каждого слота. Возвращает HealthInfo с
Cryptoki/library версиями, manufacturer и списком подключённых
токенов (label, model, serial)
- DefaultModulePath() — путь до .so для каждого провайдера (CSP,
Рутокен, Валидата, ViPNet)
- Если провайдер=stub или модуль не найден — клиент возвращает
понятную ошибку, lk-gateway переходит в режим без криптографии
В admin/setup wizard:
- В карточке «Криптография» появилась кнопка «Проверить подключение СКЗИ»
→ POST /admin/setup/crypto/check → cryptocli.Health() → flash с
результатом сверху страницы (список токенов или диагностика)
- Поле "UDS-сокет" помечено как legacy (для старого Java crypto-service),
основное поле — «Путь к модулю PKCS#11» с дефолтами и подсказками
- Расширен список провайдеров: добавлен «rutoken»
internal/cryptocli/client_test.go:
- Тесты Stub, MissingModule, EmptyPath, DefaultModulePath
- Старые тесты на UDS-сокет удалены (теперь PKCS#11)
Зависимость: github.com/miekg/pkcs11 v1.1.2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
internal/cryptocli — Go-клиент crypto-service
Реализация m2mcore.CryptoVerifier поверх gRPC по Unix Domain Socket.
Состояние
На M1 — заглушка. Подключается к UDS-сокету crypto-service, проверяет
доступность и возвращает ErrNotImplemented. Этого достаточно, чтобы:
- m2m-core и другие сервисы могли инжектить клиент без условных веток;
- логи различали «сокета нет» (например, контейнер crypto-service не запущен) от «сокет есть, но криптография не подключена» (нет лицензии КриптоПро JCP).
Когда станет полноценным
После генерации gRPC-стабов из services/crypto-service/proto/crypto.proto
(требует protoc + плагины), что в свою очередь требует доступа к
Maven Central / Go module proxy через прокси zetit.
API
cli := cryptocli.NewClient("/run/bj/crypto.sock")
info, err := cli.VerifyXMLDSig(ctx, signedXML)
if errors.Is(err, cryptocli.ErrNotImplemented) {
// M1: запасной путь (ручная проверка / откладывание).
}