From 938a859cd477435858e8a4747d63e8c9f96e7bab Mon Sep 17 00:00:00 2001 From: zuevav Date: Tue, 6 Oct 2026 13:07:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BB=D1=83=D0=B6=D0=B1=D0=B0=20bj-crypt?= =?UTF-8?q?o=20=D0=B2=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D0=B5=20=E2=80=94=20=C2=AB=D0=9F=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=C2=BB=20=D0=B2=D0=BC=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=BE=20=C2=AB=D0=BF=D1=80=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=C2=BB/?= =?UTF-8?q?=C2=AB=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D1=81=D0=B5=D1=80?= =?UTF-8?q?=D0=B2=D0=B8=D1=81=D0=B0=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi --- cmd/bj-installer/main.go | 4 ++-- internal/lkgateway/prepare.go | 2 +- internal/lkgateway/readiness.go | 8 ++++---- internal/lkgateway/setup.go | 12 +++--------- internal/lkgateway/versions.go | 4 ++-- internal/lkgateway/web/templates/admin_setup.html | 4 ++-- internal/release/components.go | 2 +- 7 files changed, 15 insertions(+), 21 deletions(-) diff --git a/cmd/bj-installer/main.go b/cmd/bj-installer/main.go index 551687d..3c5a136 100644 --- a/cmd/bj-installer/main.go +++ b/cmd/bj-installer/main.go @@ -721,7 +721,7 @@ func (in *installer) componentsFromBundle() (string, error) { if len(skipped) > 0 { if in.lic == nil { // без ключа не знаем, что входит в лицензию, — не перечисляем модули, которых у клиента может не быть - detail += "; криптосервис и модули по лицензии установятся обновлением после ввода ключа продукта" + detail += "; проверка ключа подписи и модули по лицензии установятся обновлением после ввода ключа продукта" } else { detail += "; установятся обновлением: " + strings.Join(skipped, ", ") } @@ -803,7 +803,7 @@ func (in *installer) stepServices() (string, error) { } } } - return strings.Join(files, ", ") + "; криптосервис включается после настройки ключей в bj", nil + return strings.Join(files, ", ") + "; проверка ключа подписи включится после установки ключа в bj", nil } // refreshSystem — «bj-installer refresh-system»: переписать службы systemd и служебные скрипты diff --git a/internal/lkgateway/prepare.go b/internal/lkgateway/prepare.go index 7594db8..93fa290 100644 --- a/internal/lkgateway/prepare.go +++ b/internal/lkgateway/prepare.go @@ -151,7 +151,7 @@ func unitFailCause(c release.Component) string { func prepareTitle(c release.Component) string { switch c.Name { case "crypto-service.jar": - return "Служба пробной подписи (Валидата)" + return "Проверка ключа подписи (Валидата)" } if t := moduleTitles[c.Feature]; t != "" { return t diff --git a/internal/lkgateway/readiness.go b/internal/lkgateway/readiness.go index aeb4a32..c365740 100644 --- a/internal/lkgateway/readiness.go +++ b/internal/lkgateway/readiness.go @@ -21,7 +21,7 @@ import ( "git.zetit.ru/zuevav/Bridge-and-Join-s/internal/release" ) -// cryptoJarPath — модуль службы пробной подписи bj-crypto (компонент crypto-service.jar). +// cryptoJarPath — модуль проверки ключа подписи bj-crypto (компонент crypto-service.jar). const cryptoJarPath = "/opt/bj/crypto-service.jar" // ruPlural — форма слова для числа: 1 участник, 2 участника, 5 участников. @@ -133,17 +133,17 @@ func readinessChecks(ctx context.Context, rc *RuntimeConfig) []ReadyCheck { return c } c.State, c.Detail = "ok", "Валидата "+ver - // Служба bj-crypto — пробная подпись и проверка ключа из bj; пакеты для НРД подписывает шлюз, поэтому + // Служба bj-crypto — проверка ключа подписи из bj (работает ли ключ, его сертификат); пакеты для НРД подписывает шлюз, поэтому // её остановка обмену не мешает. Модуль приезжает с обновлениями — до них службы нет, это не ошибка. if _, err := os.Stat(cryptoJarPath); err == nil { if u := unitRunState("bj-crypto"); !(u.State == "active" && u.Up >= 5*time.Second) { c.State, c.Link = "warn", "/admin/setup#sec-crypto" - c.Detail += "; служба пробной подписи bj-crypto не работает (" + pickStr(u.State, "нет") + ") — обмену не мешает: пакеты для НРД подписывает шлюз" + c.Detail += "; проверка ключа подписи из bj не работает (служба bj-crypto: " + pickStr(u.State, "нет") + ") — обмену не мешает: пакеты для НРД подписывает шлюз" if cc, ok := release.ComponentByName("crypto-service.jar"); ok && (u.Restarts >= 3 || u.State == "failed") { c.Detail += ". Причина: " + unitFailCause(cc) } } else { - c.Detail += ", служба пробной подписи bj-crypto работает" + c.Detail += ", проверка ключа подписи работает" } } return c diff --git a/internal/lkgateway/setup.go b/internal/lkgateway/setup.go index 3b9510b..4a67958 100644 --- a/internal/lkgateway/setup.go +++ b/internal/lkgateway/setup.go @@ -2,7 +2,6 @@ package lkgateway import ( "context" - "encoding/base64" "encoding/json" "errors" "fmt" @@ -447,19 +446,14 @@ func (h *setupHandlers) testSignCrypto(w http.ResponseWriter, r *http.Request) { payload := []byte("Bridge-and-Join-s sign smoke test") sig, err := cli.SignXMLDSig(r.Context(), payload, "", s.Crypto.Profile) if err != nil { - setupFlash(w, r, "Пробная подпись не удалась: "+err.Error()) + setupFlash(w, r, "Ключ не смог подписать проверочный документ: "+err.Error()) return } outPath := "/var/lib/bj/.bj/test-sign.p7s" if err := os.MkdirAll(filepath.Dir(outPath), 0o700); err == nil { _ = os.WriteFile(outPath, sig, 0o600) } - b64Preview := base64.StdEncoding.EncodeToString(sig) - if len(b64Preview) > 80 { - b64Preview = b64Preview[:80] + "..." - } - setupFlash(w, r, fmt.Sprintf("Пробная подпись OK: CMS detached, %d байт. Сохранена в %s. Префикс base64: %s", - len(sig), outPath, b64Preview)) + setupFlash(w, r, fmt.Sprintf("Ключ работает: проверочный документ подписан (подпись %d байт сохранена в %s).", len(sig), outPath)) } // SetupData — данные для шаблона admin_setup.html. @@ -1799,7 +1793,7 @@ func (h *setupHandlers) restartCrypto(w http.ResponseWriter, r *http.Request) { // Сайдкар мог уже закрыть соединение до отправки — это нормально. log.Printf("restartCrypto: Shutdown: %v (ожидаемо, если уже закрылся)", err) } - setupFlash(w, r, "crypto-service остановлен. systemd поднимет его обратно через ~5 секунд. Через 7-10 секунд обновите страницу.") + setupFlash(w, r, "Проверка ключа подписи перезапускается — через 10 секунд обновите страницу.") } // restartServer — POST /admin/setup/restart-server. Делает os.Exit(2) diff --git a/internal/lkgateway/versions.go b/internal/lkgateway/versions.go index 613093a..fa4bc61 100644 --- a/internal/lkgateway/versions.go +++ b/internal/lkgateway/versions.go @@ -153,7 +153,7 @@ func versionProbes(rc *RuntimeConfig) []versionProbe { }}, {key: "bj-lk", title: "Личный кабинет клиента (bj-lk)", section: "lk", when: comp("bj-lk"), fn: func(ctx context.Context) (string, string, error) { return componentVersion(ctx, "bj-lk") }}, - {key: "crypto-service.jar", title: "Криптосервис (crypto-service)", section: "crypto", + {key: "crypto-service.jar", title: "Проверка ключа подписи (bj-crypto)", section: "crypto", when: func() bool { return s.Crypto.Provider != "" && s.Crypto.Provider != string(cryptocli.ProviderStub) }, fn: func(ctx context.Context) (string, string, error) { cli := cryptocli.New(cryptocli.Config{Provider: cryptocli.Provider(s.Crypto.Provider), SocketPath: s.Crypto.SocketPath, ModulePath: s.Crypto.ModulePath}) @@ -167,7 +167,7 @@ func versionProbes(rc *RuntimeConfig) []versionProbe { }}, {key: "validata", title: "СКЗИ «Валидата Клиент L» (версия производителя, как на moex.com)", section: "crypto", when: func() bool { return fileExists(validataUtil) }, fn: validataVersion}, - {key: "java", title: "Java (для криптосервиса)", section: "crypto", + {key: "java", title: "Java (для проверки ключа)", section: "crypto", when: func() bool { _, err := exec.LookPath("java"); return err == nil }, fn: javaVersion}, {key: "ish", title: "Интеграционный шлюз НРД (ИШ)", section: "nsd", when: func() bool { return fileExists(ishDepsPath) }, diff --git a/internal/lkgateway/web/templates/admin_setup.html b/internal/lkgateway/web/templates/admin_setup.html index 94aa7c7..658e2da 100644 --- a/internal/lkgateway/web/templates/admin_setup.html +++ b/internal/lkgateway/web/templates/admin_setup.html @@ -242,8 +242,8 @@

Активный профиль: {{if .Settings.Crypto.Profile}}{{.Settings.Crypto.Profile}}{{else}}—{{end}} · провайдер {{if and (not devOn) (or (eq .Settings.Crypto.Provider "stub") (eq .Settings.Crypto.Provider ""))}}не настроен{{else}}{{.Settings.Crypto.Provider}}{{end}}. Подробно — справка.

-
-
+
+
diff --git a/internal/release/components.go b/internal/release/components.go index b62abb3..4d4d1d2 100644 --- a/internal/release/components.go +++ b/internal/release/components.go @@ -38,7 +38,7 @@ var Components = []Component{ {Name: "bj-installer", Title: "Установщик и системные файлы (службы, скрипты)", Path: "/usr/local/sbin/bj-installer", Exec: true, Core: true, Feature: "updates"}, // Криптосервис нужен любой установке (подпись и проверка через Валидату), но в образ не входит: // ставится с первым обновлением после ввода ключа — как выделенный из ядра модуль. - {Name: "crypto-service.jar", Title: "Криптосервис", Path: "/opt/bj/crypto-service.jar", Unit: "bj-crypto", FromCore: true, Feature: "updates"}, + {Name: "crypto-service.jar", Title: "Проверка ключа подписи", Path: "/opt/bj/crypto-service.jar", Unit: "bj-crypto", FromCore: true, Feature: "updates"}, {Name: "bj-lk", Title: "Личный кабинет клиента", Path: "/opt/bj/bj-lk", Unit: "bj-lk", Exec: true, Feature: "web-cabinet"}, {Name: "bj-npr", Title: "Риск-монитор НПР / УДС", Path: "/opt/bj/bj-npr", Unit: "bj-npr", Exec: true, FromCore: true, Feature: "npr"}, {Name: "bj-quikexport", Title: "Экспорт QUIK", Path: "/opt/bj/bj-quikexport", Unit: "bj-quikexport", Exec: true, FromCore: true, Feature: "quik-export"},