From 7d19701ea8fe9c38422b6e6dd14e4227adb43360 Mon Sep 17 00:00:00 2001 From: va4es2 Date: Thu, 2 May 2024 11:46:39 +0300 Subject: [PATCH] =?UTF-8?q?bug(cryptopro-cades):=20=D0=9D=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=20=D1=83=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=BD=D0=B0=D0=B2=D0=BB=D0=B8=D0=B2=D0=B0=D0=B5?= =?UTF-8?q?=D1=82=D1=81=D1=8F=20=D1=84=D0=BB=D0=B0=D0=B3=20hasPrivateKey?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B8=20=D0=BF=D1=80=D0=BE=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D0=B5=20=D0=BF=D0=BE=D0=B8=D1=81=D0=BA=D0=B0=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BA=D1=80=D1=8B=D1=82=D0=BE=D0=B3=D0=BE=20=D0=BA=D0=BB?= =?UTF-8?q?=D1=8E=D1=87=D0=B0=20=D1=81=D0=B5=D1=80=D1=82=D0=B8=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0.=20(#49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * bug(cryptopro-cades): Поправил корректное определение наличия контейнера закрытого ключа в системе. feat(cryptopro-cades): Добавил необязательные параметры функциям получения списка сертификатов, подписи, подписи хэша файла для гибкости работы с ними. * bug(cryptopro-cades): Поиск ключа по Skid всегда вызывал поиск по всем носителям с проверкой закрытого ключа, даже если не требуется. Добавил параметры вызова функции поиска сертификата для гибкости. * bug(cryptopro-cades): Некорректно устанавливается флаг hasPrivateKey при пропуске поиска закрытого ключа сертификата. --------- Co-authored-by: va4es2 --- packages/cryptopro-cades/src/Certificate.ts | 38 +++++++++---------- .../src/api/findCertificateBySkid.ts | 4 +- .../src/api/findCertificateByThumbprint.ts | 4 +- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/packages/cryptopro-cades/src/Certificate.ts b/packages/cryptopro-cades/src/Certificate.ts index 92ad139..317c397 100644 --- a/packages/cryptopro-cades/src/Certificate.ts +++ b/packages/cryptopro-cades/src/Certificate.ts @@ -171,27 +171,25 @@ export class Certificate { cert.Export(CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64), ); - if (checkPrivateKey) { - try { - certificate.hasPrivateKey = await unwrap(cert.HasPrivateKey()); - - const oPrivateKey = await unwrap(cert.PrivateKey); - - certificate.providerName = await unwrap(oPrivateKey.ProviderName); - certificate.providerType = await unwrap(oPrivateKey.ProviderType); - - if (certificate.hasPrivateKey) { - await unwrap(cert.FindPrivateKey()); - } - } catch (error) { - // ошибка не критична, просто создаем ошибку (в дебаге оно залогируется само) - CryptoError.createCadesError( - error, - `Ошибка получения информации о приватном ключе сертификата ${certificate.thumbprint}.`, - ); - - certificate.hasPrivateKey = false; + try { + certificate.hasPrivateKey = await unwrap(cert.HasPrivateKey()); + + const oPrivateKey = await unwrap(cert.PrivateKey); + + certificate.providerName = await unwrap(oPrivateKey.ProviderName); + certificate.providerType = await unwrap(oPrivateKey.ProviderType); + + if (checkPrivateKey && certificate.hasPrivateKey) { + await unwrap(cert.FindPrivateKey()); } + } catch (error) { + // ошибка не критична, просто создаем ошибку (в дебаге оно залогируется само) + CryptoError.createCadesError( + error, + `Ошибка получения информации о приватном ключе сертификата ${certificate.thumbprint}.`, + ); + + certificate.hasPrivateKey = false; } parseCertificate(certificate); diff --git a/packages/cryptopro-cades/src/api/findCertificateBySkid.ts b/packages/cryptopro-cades/src/api/findCertificateBySkid.ts index 3de9540..429ca6b 100644 --- a/packages/cryptopro-cades/src/api/findCertificateBySkid.ts +++ b/packages/cryptopro-cades/src/api/findCertificateBySkid.ts @@ -8,14 +8,14 @@ import { getCertificates } from './../api'; * Поиск в хранилищах сертификата. * @param {string} subjectKeyId -идентификатор ключа субъекта. * @param {STORE_TYPE} storeType в каком хранилище требуется поискать сертификат (из токена, реестра, все...). - * @param {boolean} [checkPrivateKey=false] проводить проверку наличия закрытого ключа. + * @param {boolean} [checkPrivateKey=true] проводить проверку наличия закрытого ключа. * @throws {CryptoError} в случае ошибки. * @returns {@Promise} сертификат. */ export async function findCertificateBySkid( subjectKeyId: string, storeType: STORE_TYPE = STORE_TYPE.ALL, - checkPrivateKey: boolean = false, + checkPrivateKey: boolean = true, ): Promise { if (!subjectKeyId) { const errorMessage = diff --git a/packages/cryptopro-cades/src/api/findCertificateByThumbprint.ts b/packages/cryptopro-cades/src/api/findCertificateByThumbprint.ts index caa7de7..e121790 100644 --- a/packages/cryptopro-cades/src/api/findCertificateByThumbprint.ts +++ b/packages/cryptopro-cades/src/api/findCertificateByThumbprint.ts @@ -9,11 +9,13 @@ import { unwrap } from './internal/unwrap'; /** * Поиск в хранилищах сертификата. * @param {string} thumbprint -отпечаток искомого сертификата. + * @param {boolean} [checkPrivateKey=true] проводить проверку наличия закрытого ключа. * @throws {CryptoError} в случае ошибки. * @returns {Promise} сертификат. */ export async function findCertificateByThumbprint( thumbprint: string, + checkPrivateKey: boolean = true, ): Promise { if (!thumbprint) { const errorMessage = 'Не указан отпечаток искомого сертификата.'; @@ -35,7 +37,7 @@ export async function findCertificateByThumbprint( ); const cert = await unwrap(certFind.Item(1)); - return cert ? await Certificate.CreateFrom(cert) : undefined; + return cert ? await Certificate.CreateFrom(cert, checkPrivateKey) : undefined; } catch (err) { throw CryptoError.createCadesError(err, 'Ошибка получения сертификата.'); } finally {