docs(cryptopro): инструкция установки CSP по реальному опыту + LD_LIBRARY_PATH в systemd
После реальной установки на 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) <noreply@anthropic.com>
This commit is contained in:
@@ -19,6 +19,13 @@ Environment=BJ_SETUP_PATH=/var/lib/bj/setup.json
|
|||||||
Environment=BJ_M2M_SENDER=MC0079200000
|
Environment=BJ_M2M_SENDER=MC0079200000
|
||||||
Environment=BJ_M2M_RECEIVER=MC0010300000
|
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
|
NoNewPrivileges=true
|
||||||
ProtectSystem=strict
|
ProtectSystem=strict
|
||||||
|
|||||||
@@ -95,19 +95,21 @@ func (h *setupHandlers) installCryptoPro(w http.ResponseWriter, r *http.Request)
|
|||||||
// Распаковка (если .tar/.tgz/.tar.gz).
|
// Распаковка (если .tar/.tgz/.tar.gz).
|
||||||
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute)
|
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Minute)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
if strings.HasSuffix(strings.ToLower(dst), ".rpm") {
|
lower := strings.ToLower(dst)
|
||||||
// Один rpm — установим напрямую.
|
switch {
|
||||||
} else if strings.HasSuffix(strings.ToLower(dst), ".tar.gz") || strings.HasSuffix(strings.ToLower(dst), ".tgz") {
|
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 {
|
if untar, err := runCmdInDir(ctx, dir, "tar", "-xzf", dst); err != nil {
|
||||||
setupFlash(w, r, "Установка: распаковка .tgz упала: "+err.Error()+" / вывод: "+untar)
|
setupFlash(w, r, "Установка: распаковка .tgz упала: "+err.Error()+" / вывод: "+untar)
|
||||||
return
|
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 {
|
if untar, err := runCmdInDir(ctx, dir, "tar", "-xf", dst); err != nil {
|
||||||
setupFlash(w, r, "Установка: распаковка .tar упала: "+err.Error()+" / вывод: "+untar)
|
setupFlash(w, r, "Установка: распаковка .tar упала: "+err.Error()+" / вывод: "+untar)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
} else {
|
default:
|
||||||
setupFlash(w, r, "Установка: неизвестный формат файла, нужен .tar/.tgz/.tar.gz/.rpm")
|
setupFlash(w, r, "Установка: неизвестный формат файла, нужен .tar/.tgz/.tar.gz/.rpm")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,18 +21,35 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<h2>2. Установка КриптоПро CSP на РЕД ОС</h2>
|
<h2>2. Установка КриптоПро CSP на РЕД ОС (проверено)</h2>
|
||||||
<p>Скачать дистрибутив с <code>www.cryptopro.ru</code> (Linux x86_64).</p>
|
<p><strong>Способ 1 — через веб-интерфейс (рекомендуется):</strong> <a href="/admin/setup">/admin/setup</a> → «СКЗИ» → «Установка КриптоПро CSP» → выбрать <code>linux-amd64.tar</code> с cryptopro.ru → «Загрузить и установить».</p>
|
||||||
<pre>sudo rpm -i cprocsp-rdr-gui-gtk-64-5.0.*.rpm \
|
<p><strong>Способ 2 — вручную из терминала.</strong> Скачать <code>linux-amd64.tgz</code> с <code>www.cryptopro.ru/products/csp/downloads</code> (доступ через личный кабинет), распаковать на ВМ и установить минимальный набор:</p>
|
||||||
cprocsp-rdr-64-5.0.*.rpm \
|
<pre>tar -xzf linux-amd64.tgz
|
||||||
cprocsp-ca-certs-64-5.0.*.rpm \
|
cd linux-amd64
|
||||||
lsb-cprocsp-base-5.0.*.rpm \
|
sudo rpm -Uvh --replacepkgs --nodeps \
|
||||||
lsb-cprocsp-rdr-64-5.0.*.rpm</pre>
|
lsb-cprocsp-base-5.0.*.noarch.rpm \
|
||||||
<p>Активация лицензии:</p>
|
lsb-cprocsp-ca-certs-5.0.*.noarch.rpm \
|
||||||
<pre>sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set XXXX-XXXXX-XXXXX-XXXXX-XXXXX</pre>
|
lsb-cprocsp-rdr-64-5.0.*.x86_64.rpm \
|
||||||
<p>Проверка:</p>
|
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</pre>
|
||||||
|
<p>Ключевые пакеты:</p>
|
||||||
|
<ul>
|
||||||
|
<li><code>lsb-cprocsp-base</code> + <code>lsb-cprocsp-rdr-64</code> — базовая инфраструктура</li>
|
||||||
|
<li><code>lsb-cprocsp-capilite-64</code> — CAPILite (<code>libcapi20.so.4</code>, <code>libcpext.so.4</code>) — иначе libcppkcs11.so не загрузится</li>
|
||||||
|
<li><code>lsb-cprocsp-kc1-64</code> — CSP класса КС1 (без него Initialize упадёт с CKR_FUNCTION_FAILED)</li>
|
||||||
|
<li><code>lsb-cprocsp-pkcs11-64</code> — собственно <code>libcppkcs11.so</code></li>
|
||||||
|
</ul>
|
||||||
|
<p>Демо-лицензия на 3 месяца встроена в дистрибутив, отдельная активация не требуется. Проверка:</p>
|
||||||
<pre>/opt/cprocsp/sbin/amd64/cpconfig -license -view
|
<pre>/opt/cprocsp/sbin/amd64/cpconfig -license -view
|
||||||
/opt/cprocsp/bin/amd64/csptest -keyset -enum -unique</pre>
|
/opt/cprocsp/bin/amd64/csptest -keyset -enum -unique</pre>
|
||||||
|
<p><strong>Важно — LD_LIBRARY_PATH.</strong> КриптоПро CSP кладёт .so в <code>/opt/cprocsp/lib/amd64</code> без записи в <code>/etc/ld.so.conf.d</code>. Bj-server при запуске должен иметь:</p>
|
||||||
|
<pre>Environment=LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64</pre>
|
||||||
|
<p>В systemd-юните это уже прописано (<code>deploy/systemd/bj-server.service</code>). При ручном запуске из shell — <code>LD_LIBRARY_PATH=/opt/cprocsp/lib/amd64 ./bin/bj-server</code>.</p>
|
||||||
|
<p><strong>Активация коммерческой лицензии.</strong> После того как демо истечёт, серийник вводится через UI на <a href="/admin/setup">/admin/setup</a> → «Активация лицензии», или вручную:</p>
|
||||||
|
<pre>sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set XXXX-XXXXX-XXXXX-XXXXX-XXXXX</pre>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|||||||
Reference in New Issue
Block a user