Пересборка справочника: выбирать подписанта по действующему ключу (чинит ложный E070004C)
crestor выбирал сертификат подписанта ПСП по имени владельца. Если у владельца в справочнике несколько сертификатов (перевыпуск ключа — у клиента так бывает), crestor брал первый по имени и мог попасть на старый с истёкшим сроком закрытого ключа → E070004C «Ключ ЭП/закрытый ключ шифрования уже истёк», хотя на носителе свежий действующий ключ. bj-validata-rebuild-gdbm: при E070004C перебирает leaf-сертификаты с НЕ истёкшим сроком закрытого ключа (свежие первыми, до 25) и указывает подписанта явно (-signer -dercer). Правильный (чей закрытый ключ на носителе) даёт Результат: OK, остальные — ошибку, идём дальше. Проверено на живой флешке клиента: справочник пересобрался (cf9a5713), signer выбран верный. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -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
|
CRLARGS=""; for c in "$WORK"/3crl_*.der; do [ -f "$c" ] && CRLARGS="$CRLARGS -dercrl $c"; done
|
||||||
[ -n "$CERTARGS" ] || { echo "{\"ok\":false,\"error\":\"сертификаты не извлечены ($EX)\"}"; exit 1; }
|
[ -n "$CERTARGS" ] || { echo "{\"ok\":false,\"error\":\"сертификаты не извлечены ($EX)\"}"; exit 1; }
|
||||||
|
|
||||||
# 2) пересобрать gdbm во временной папке (ключ подписи стора — с носителя)
|
# 2) пересобрать gdbm во временной папке. ПСП подписывается ключом с НОСИТЕЛЯ.
|
||||||
OUT=$(LD_LIBRARY_PATH="$VDLIB" "$ZPKI" -minimal -tools -crestor \
|
# crestor по умолчанию выбирает сертификат подписанта ПО ИМЕНИ владельца. Если у
|
||||||
-uripse "pse://signed//$WORK/local.pse" -uriloc "file://$WORK/local.gdbm" \
|
# владельца в справочнике несколько сертификатов (перевыпуск ключа — у клиента так
|
||||||
$CERTARGS $CRLARGS 2>&1)
|
# бывает), 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
|
if ! echo "$OUT" | grep -qi 'Результат: OK'; then
|
||||||
ERR=$(echo "$OUT" | grep -iE 'ошибк|Результат' | head -1 | tr -d '"')
|
ERR=$(echo "$OUT" | grep -iE 'ошибк|Результат' | head -1 | tr -d '"')
|
||||||
echo "{\"ok\":false,\"error\":\"crestor: $ERR\"}"; exit 1
|
echo "{\"ok\":false,\"error\":\"crestor: $ERR\"}"; exit 1
|
||||||
|
|||||||
@@ -1,27 +1,27 @@
|
|||||||
{
|
{
|
||||||
"bj-component-install": {
|
"bj-component-install": {
|
||||||
"fingerprint": "c3a389928dd5c099e7fa4a15f5bdd3de43f3eec500b42517431f914646fd9c9e",
|
"fingerprint": "61cfd9db5bd1d70d74f6fde0f6c37d18747c8310197a9942abc7139dc3b86687",
|
||||||
"version": "2026.10.21.2"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"bj-installer": {
|
"bj-installer": {
|
||||||
"fingerprint": "1f4e11a07b96994ddb328db07df13e20c3c2df1d966c949adc53cceac01aa52e",
|
"fingerprint": "8598d4f35fc05d882596e8e4a599f44443cbfa3b0f6ea5c4de4ecbfadd5dab01",
|
||||||
"version": "2026.10.21.2"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"bj-lk": {
|
"bj-lk": {
|
||||||
"fingerprint": "37bf4ba7d13bc3cfb52032dfb95851b9d5d702f1a2244e185a1b6a5b87a5cfc6",
|
"fingerprint": "48a6cac59febba3392c854423b729f426383d86d35514578b5546786c8ab3355",
|
||||||
"version": "2026.10.21.2"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"bj-npr": {
|
"bj-npr": {
|
||||||
"fingerprint": "5b5301b0c18bfd001bdff3f3b35a9ff6ccccb4f24eb4b88b0334d34d1b63df81",
|
"fingerprint": "357f7562645da12ec4689927f5599a2aa22996a34bd82b36f80ece26629ac036",
|
||||||
"version": "2026.10.21.2"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"bj-quikexport": {
|
"bj-quikexport": {
|
||||||
"fingerprint": "f7761571352f17173c10989f72a3a9686e58cfc0c0a78ae7299bacbe31d36df6",
|
"fingerprint": "136cb4068888239e792d4eaedb973f430ce01542d124066fc914847a147c3549",
|
||||||
"version": "2026.10.21.2"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"bj-server": {
|
"bj-server": {
|
||||||
"fingerprint": "e9c9dfce3273b86c75c02b3f0e01856716db598be5ca7cb858ede722b1f42c0b",
|
"fingerprint": "b4ea83379567a8d6be59005c79d11c5dbe972a5108b832b9344467f970f26b71",
|
||||||
"version": "2026.10.21.3"
|
"version": "2026.10.21.4"
|
||||||
},
|
},
|
||||||
"crypto-service.jar": {
|
"crypto-service.jar": {
|
||||||
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",
|
"fingerprint": "2c4fd536bc9b1c20c69a70e8dcd374a61847b263aeb2e474c45debb01fbd8233",
|
||||||
|
|||||||
Reference in New Issue
Block a user