From 3e34995e691a2dc2346f7d8fbe28873a7d1f0bb7 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Thu, 14 May 2026 15:21:08 +0300 Subject: [PATCH] =?UTF-8?q?docs(cryptopro):=20=D0=B8=D0=BD=D1=81=D1=82?= =?UTF-8?q?=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F=20=D1=83=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=B8=20CSP=20=D0=BF=D0=BE=20=D1=80?= =?UTF-8?q?=D0=B5=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=BC=D1=83=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=8B=D1=82=D1=83=20+=20LD=5FLIBRARY=5FPATH=20=D0=B2=20systemd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После реальной установки на dev-ВМ выяснилось: - Минимальный набор rpm-пакетов для работы PKCS#11 — 8 штук, в т.ч. lsb-cprocsp-capilite-64 (libcapi20.so.4) и lsb-cprocsp-kc1-64 (CSP уровня КС1). Без kc1 Initialize() возвращает CKR_FUNCTION_FAILED. - КриптоПро не пишет /etc/ld.so.conf.d, поэтому Go-клиент cryptocli не находит libcppkcs11.so. Решение — LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 в окружении bj-server. - Демо-лицензия на 3 месяца встроена в дистрибутив — отдельная активация не требуется до истечения. deploy/systemd/bj-server.service: - добавлена Environment=LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 с пояснением в комментарии internal/lkgateway/web/templates/admin_help_cryptopro.html: - секция «Установка КриптоПро CSP на РЕД ОС» полностью переписана: - две команды: через UI (рекомендуется) и через rpm вручную - полный список 8 нужных пакетов с пояснением каждого - предупреждение про LD_LIBRARY_PATH и команда для запуска из shell - информация про демо-лицензию (94 дня встроены) internal/lkgateway/setup.go: - if-else цепочка распаковки заменена на switch (gocritic lint) Проверено: после установки kc1 веб-кнопка «Проверить подключение СКЗИ» показывает «Доступно токенов: 1. Криптография готова к работе. (PKCS#11 v2.11, cryptopro.ru). Токены: CryptoPro Token (CPPKCS 3)». Co-Authored-By: Claude Opus 4.7 (1M context) --- deploy/systemd/bj-server.service | 7 ++++ internal/lkgateway/setup.go | 12 +++--- .../web/templates/admin_help_cryptopro.html | 37 ++++++++++++++----- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/deploy/systemd/bj-server.service b/deploy/systemd/bj-server.service index 69f1102..47e5142 100644 --- a/deploy/systemd/bj-server.service +++ b/deploy/systemd/bj-server.service @@ -19,6 +19,13 @@ Environment=BJ_SETUP_PATH=/var/lib/bj/setup.json Environment=BJ_M2M_SENDER=MC0079200000 Environment=BJ_M2M_RECEIVER=MC0010300000 +# КриптоПро CSP кладёт .so в /opt/cprocsp/lib/amd64 без записи в +# /etc/ld.so.conf.d. Чтобы Go-PKCS#11 клиент (cryptocli) нашёл +# libcppkcs11.so и его зависимости (libcapi20, libcpext, liburlretrieve), +# подмешиваем путь через LD_LIBRARY_PATH. Без этого Initialize() падает +# с CKR_FUNCTION_FAILED или 'cannot open shared object file'. +Environment=LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 + # Безопасность. NoNewPrivileges=true ProtectSystem=strict diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index 20287f4..7ccb0de 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -95,19 +95,21 @@ func (h *setupHandlers) installCryptoPro(w http.ResponseWriter, r *http.Request) // Распаковка (если .tar/.tgz/.tar.gz). ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute) defer cancel() - if strings.HasSuffix(strings.ToLower(dst), ".rpm") { - // Один rpm — установим напрямую. - } else if strings.HasSuffix(strings.ToLower(dst), ".tar.gz") || strings.HasSuffix(strings.ToLower(dst), ".tgz") { + lower := strings.ToLower(dst) + switch { + case strings.HasSuffix(lower, ".rpm"): + // Один rpm — установим напрямую без распаковки. + case strings.HasSuffix(lower, ".tar.gz") || strings.HasSuffix(lower, ".tgz"): if untar, err := runCmdInDir(ctx, dir, "tar", "-xzf", dst); err != nil { setupFlash(w, r, "Установка: распаковка .tgz упала: "+err.Error()+" / вывод: "+untar) return } - } else if strings.HasSuffix(strings.ToLower(dst), ".tar") { + case strings.HasSuffix(lower, ".tar"): if untar, err := runCmdInDir(ctx, dir, "tar", "-xf", dst); err != nil { setupFlash(w, r, "Установка: распаковка .tar упала: "+err.Error()+" / вывод: "+untar) return } - } else { + default: setupFlash(w, r, "Установка: неизвестный формат файла, нужен .tar/.tgz/.tar.gz/.rpm") return } diff --git a/internal/lkgateway/web/templates/admin_help_cryptopro.html b/internal/lkgateway/web/templates/admin_help_cryptopro.html index 589453d..183f3a3 100644 --- a/internal/lkgateway/web/templates/admin_help_cryptopro.html +++ b/internal/lkgateway/web/templates/admin_help_cryptopro.html @@ -21,18 +21,35 @@
-

2. Установка КриптоПро CSP на РЕД ОС

-

Скачать дистрибутив с www.cryptopro.ru (Linux x86_64).

-
sudo rpm -i cprocsp-rdr-gui-gtk-64-5.0.*.rpm \
-            cprocsp-rdr-64-5.0.*.rpm \
-            cprocsp-ca-certs-64-5.0.*.rpm \
-            lsb-cprocsp-base-5.0.*.rpm \
-            lsb-cprocsp-rdr-64-5.0.*.rpm
-

Активация лицензии:

-
sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set XXXX-XXXXX-XXXXX-XXXXX-XXXXX
-

Проверка:

+

2. Установка КриптоПро CSP на РЕД ОС (проверено)

+

Способ 1 — через веб-интерфейс (рекомендуется): /admin/setup → «СКЗИ» → «Установка КриптоПро CSP» → выбрать linux-amd64.tar с cryptopro.ru → «Загрузить и установить».

+

Способ 2 — вручную из терминала. Скачать linux-amd64.tgz с www.cryptopro.ru/products/csp/downloads (доступ через личный кабинет), распаковать на ВМ и установить минимальный набор:

+
tar -xzf linux-amd64.tgz
+cd linux-amd64
+sudo rpm -Uvh --replacepkgs --nodeps \
+    lsb-cprocsp-base-5.0.*.noarch.rpm \
+    lsb-cprocsp-ca-certs-5.0.*.noarch.rpm \
+    lsb-cprocsp-rdr-64-5.0.*.x86_64.rpm \
+    lsb-cprocsp-capilite-64-5.0.*.x86_64.rpm \
+    lsb-cprocsp-kc1-64-5.0.*.x86_64.rpm \
+    lsb-cprocsp-pkcs11-64-5.0.*.x86_64.rpm \
+    cprocsp-curl-64-5.0.*.x86_64.rpm \
+    cprocsp-rdr-gui-gtk-64-5.0.*.x86_64.rpm
+

Ключевые пакеты:

+
    +
  • lsb-cprocsp-base + lsb-cprocsp-rdr-64 — базовая инфраструктура
  • +
  • lsb-cprocsp-capilite-64 — CAPILite (libcapi20.so.4, libcpext.so.4) — иначе libcppkcs11.so не загрузится
  • +
  • lsb-cprocsp-kc1-64 — CSP класса КС1 (без него Initialize упадёт с CKR_FUNCTION_FAILED)
  • +
  • lsb-cprocsp-pkcs11-64 — собственно libcppkcs11.so
  • +
+

Демо-лицензия на 3 месяца встроена в дистрибутив, отдельная активация не требуется. Проверка:

/opt/cprocsp/sbin/amd64/cpconfig -license -view
 /opt/cprocsp/bin/amd64/csptest -keyset -enum -unique
+

Важно — LD_LIBRARY_PATH. КриптоПро CSP кладёт .so в /opt/cprocsp/lib/amd64 без записи в /etc/ld.so.conf.d. Bj-server при запуске должен иметь:

+
Environment=LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64
+

В systemd-юните это уже прописано (deploy/systemd/bj-server.service). При ручном запуске из shell — LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 ./bin/bj-server.

+

Активация коммерческой лицензии. После того как демо истечёт, серийник вводится через UI на /admin/setup → «Активация лицензии», или вручную:

+
sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set XXXX-XXXXX-XXXXX-XXXXX-XXXXX