From ed2d0ce4e50d97077f537d054ed8bace263e6296 Mon Sep 17 00:00:00 2001 From: fontvielle Date: Wed, 21 Oct 2026 13:14:24 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=81=D0=B1=D0=BE?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=B0:=20=D0=B2=D1=8B=D0=B1=D0=B8=D1=80?= =?UTF-8?q?=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=20=D0=BF=D0=BE=20=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D1=83=D1=8E=D1=89=D0=B5=D0=BC=D1=83=20=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D1=83=20(=D1=87=D0=B8=D0=BD=D0=B8=D1=82=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B6=D0=BD=D1=8B=D0=B9=20E070004C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit crestor выбирал сертификат подписанта ПСП по имени владельца. Если у владельца в справочнике несколько сертификатов (перевыпуск ключа — у клиента так бывает), crestor брал первый по имени и мог попасть на старый с истёкшим сроком закрытого ключа → E070004C «Ключ ЭП/закрытый ключ шифрования уже истёк», хотя на носителе свежий действующий ключ. bj-validata-rebuild-gdbm: при E070004C перебирает leaf-сертификаты с НЕ истёкшим сроком закрытого ключа (свежие первыми, до 25) и указывает подписанта явно (-signer -dercer). Правильный (чей закрытый ключ на носителе) даёт Результат: OK, остальные — ошибку, идём дальше. Проверено на живой флешке клиента: справочник пересобрался (cf9a5713), signer выбран верный. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn --- deploy/linux/sbin/bj-validata-rebuild-gdbm | 36 +++++++++++++++++++--- deploy/release/component-versions.json | 24 +++++++-------- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/deploy/linux/sbin/bj-validata-rebuild-gdbm b/deploy/linux/sbin/bj-validata-rebuild-gdbm index 603533b..6fcddf2 100755 --- a/deploy/linux/sbin/bj-validata-rebuild-gdbm +++ b/deploy/linux/sbin/bj-validata-rebuild-gdbm @@ -86,10 +86,38 @@ CERTARGS=""; for c in "$WORK"/1leaf_*.der "$WORK"/2ca_*.der; do [ -f "$c" ] && C CRLARGS=""; for c in "$WORK"/3crl_*.der; do [ -f "$c" ] && CRLARGS="$CRLARGS -dercrl $c"; done [ -n "$CERTARGS" ] || { echo "{\"ok\":false,\"error\":\"сертификаты не извлечены ($EX)\"}"; exit 1; } -# 2) пересобрать gdbm во временной папке (ключ подписи стора — с носителя) -OUT=$(LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -minimal -tools -crestor \ - -uripse "pse://signed//$WORK/local.pse" -uriloc "file://$WORK/local.gdbm" \ - $CERTARGS $CRLARGS 2>&1) +# 2) пересобрать gdbm во временной папке. ПСП подписывается ключом с НОСИТЕЛЯ. +# crestor по умолчанию выбирает сертификат подписанта ПО ИМЕНИ владельца. Если у +# владельца в справочнике несколько сертификатов (перевыпуск ключа — у клиента так +# бывает), crestor берёт первый по имени и может попасть на СТАРЫЙ с истёкшим сроком +# закрытого ключа → E070004C, хотя на носителе свежий действующий ключ. Тогда +# перебираем сертификаты с НЕ истёкшим сроком закрытого ключа (свежие — первыми) и +# указываем подписанта явно (-signer). Правильный (чей закрытый ключ на носителе) +# даёт «Результат: OK», остальные — ошибку, и мы идём дальше. +run_crestor() { # $1 — DER-файл сертификата подписанта (необязательно) + local sgn=""; [ -n "${1:-}" ] && sgn="-signer -dercer $1" + LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -minimal -tools -crestor \ + -uripse "pse://signed//$WORK/local.pse" -uriloc "file://$WORK/local.gdbm" \ + $sgn $CERTARGS $CRLARGS 2>&1 +} +OUT=$(run_crestor "") +if echo "$OUT" | grep -qiE 'E070004C|срок действия ключа ЭП'; then + NOW=$(date -u +%s) + CANDS=$(for c in "$WORK"/1leaf_*.der; do + [ -f "$c" ] || continue + pk=$(openssl x509 -inform DER -in "$c" -noout -text 2>/dev/null | awk '/Private Key Usage Period/{f=1} f&&/Not After/{sub(/.*Not After: /,"");print;exit}') + [ -n "$pk" ] || continue + ex=$(date -u -d "$pk" +%s 2>/dev/null) || continue + [ "$ex" -gt "$NOW" ] || continue + nb=$(openssl x509 -inform DER -in "$c" -noout -startdate 2>/dev/null | sed 's/notBefore=//') + nbs=$(date -u -d "$nb" +%s 2>/dev/null || echo 0) + printf '%s %s\n' "$nbs" "$c" + done | sort -rn | awk '{print $2}' | head -25) + for c in $CANDS; do + OUT=$(run_crestor "$c") + if echo "$OUT" | grep -qi 'Результат: OK'; then echo "signer: $(basename "$c")" >&2; break; fi + done +fi if ! echo "$OUT" | grep -qi 'Результат: OK'; then ERR=$(echo "$OUT" | grep -iE 'ошибк|Результат' | head -1 | tr -d '"') echo "{\"ok\":false,\"error\":\"crestor: $ERR\"}"; exit 1 diff --git a/deploy/release/component-versions.json b/deploy/release/component-versions.json index eaae64e..175a6d1 100644 --- a/deploy/release/component-versions.json +++ b/deploy/release/component-versions.json @@ -1,27 +1,27 @@ { "bj-component-install": { - "fingerprint": "c3a389928dd5c099e7fa4a15f5bdd3de43f3eec500b42517431f914646fd9c9e", - "version": "2026.10.21.2" + "fingerprint": "61cfd9db5bd1d70d74f6fde0f6c37d18747c8310197a9942abc7139dc3b86687", + "version": "2026.10.21.4" }, "bj-installer": { - "fingerprint": "1f4e11a07b96994ddb328db07df13e20c3c2df1d966c949adc53cceac01aa52e", - "version": "2026.10.21.2" + "fingerprint": "8598d4f35fc05d882596e8e4a599f44443cbfa3b0f6ea5c4de4ecbfadd5dab01", + "version": "2026.10.21.4" }, "bj-lk": { - "fingerprint": "37bf4ba7d13bc3cfb52032dfb95851b9d5d702f1a2244e185a1b6a5b87a5cfc6", - "version": "2026.10.21.2" + "fingerprint": "48a6cac59febba3392c854423b729f426383d86d35514578b5546786c8ab3355", + "version": "2026.10.21.4" }, "bj-npr": { - "fingerprint": "5b5301b0c18bfd001bdff3f3b35a9ff6ccccb4f24eb4b88b0334d34d1b63df81", - "version": "2026.10.21.2" + "fingerprint": "357f7562645da12ec4689927f5599a2aa22996a34bd82b36f80ece26629ac036", + "version": "2026.10.21.4" }, "bj-quikexport": { - "fingerprint": "f7761571352f17173c10989f72a3a9686e58cfc0c0a78ae7299bacbe31d36df6", - "version": "2026.10.21.2" + "fingerprint": "136cb4068888239e792d4eaedb973f430ce01542d124066fc914847a147c3549", + "version": "2026.10.21.4" }, "bj-server": { - "fingerprint": "e9c9dfce3273b86c75c02b3f0e01856716db598be5ca7cb858ede722b1f42c0b", - "version": "2026.10.21.3" + "fingerprint": "b4ea83379567a8d6be59005c79d11c5dbe972a5108b832b9344467f970f26b71", + "version": "2026.10.21.4" }, "crypto-service.jar": { "fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",