Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73 Сказал(а) «Спасибо»: 2 раз
|
А вот тут возможный сюрприз... На машине оказалось НЕСКОЛЬКО capicom'ов.
Цитата:e72fd41410b2fc7123cd7453cd671dc6 *capicom.dll e72fd41410b2fc7123cd7453cd671dc6 *capicom_1.dll e72fd41410b2fc7123cd7453cd671dc6 *capicom_3.dll 9130cce19b5db3d2e31f9f789263fc4a *capicom_2.dll be76c995d2185d909140d285777cfa4d *CapiCom_4.dll
C:\ProgramData\Crypto Pro\Installer Cache\CADESCOM_CSP_2.0.14990\cadescom\Common\Microsoft Shared\CAPICOM\capicom.dll FileVersion : 2, 1, 0, 3 LegalCopyright : Copyright (c) 1999-2006 Microsoft Corporation SpecialBuild : VERSION_INFO fixed by CryptoPro OleSelfRegister : C:\ProgramData\Crypto Pro\Installer Cache\CADESCOM_2.0.14892\cadescom\Common\Microsoft Shared\CAPICOM\capicom.dll FileVersion : 2, 1, 0, 3 LegalCopyright : Copyright (c) 1999-2006 Microsoft Corporation SpecialBuild : VERSION_INFO fixed by CryptoPro OleSelfRegister : C:\Program Files (x86)\Microsoft CAPICOM 2.1.0.2\Lib\X86\capicom.dll FileVersion : 2, 1, 0, 2 LegalCopyright : Copyright (c) 1999-2006 Microsoft Corporation SpecialBuild : Gold C:\Program Files (x86)\Common Files\Microsoft Shared\CAPICOM\capicom.dll FileVersion : 2, 1, 0, 3 LegalCopyright : Copyright (c) 1999-2006 Microsoft Corporation SpecialBuild : VERSION_INFO fixed by CryptoPro OleSelfRegister : C:\Program Files\Common Files\microsoft shared\CAPICOM\CapiCom.dll FileVersion : 2, 1, 0, 1 LegalCopyright : Copyright (c) 1999-2004 Microsoft Corporation SpecialBuild : Gold
Библиотеки CryptoPro не умеют выбирать сертификат из нескольких установленных, поэтому для этого выбора (если серийник не "прибит гвоздиком") надо вызывать функции Майкрософта. Windows Scripting Host, синтез нескольких примеров и фрагментарной документации.
Код:// private
function GetUserSignCert(ASN)
{
var LStr = ASN.toString().trim(); // https://stackoverflow.com/questions/154059/how-do-i-check-for-an-empty-undefined-null-string-in-javascript
// метод Select не реализован в CryptoPro! #51499#note-25
var CertsStoreObjName = LStr? "CAdESCOM.Store" : "CAPICOM.Store";
// var CertsStorageID = LStr? CADESCOM_CONTAINER_STORE() : CAPICOM_CURRENT_USER_STORE();
var CertsStorageID = CAPICOM_CURRENT_USER_STORE(); // CADESCOM_CONTAINER_STORE не работает на демо-CryptoPro
try {
var Store = new ActiveXObject(CertsStoreObjName);
Store.Open(CertsStorageID, CAPICOM_MY_STORE(), CAPICOM_STORE_OPEN_READ_ONLY());
} catch(err) {
UserMessageErrAbort(err.description + " (" + CertsStoreObjName + ")");
}
var Certs = Store.Certificates;
// Из них не рассматриваются сертификаты, в которых отсутствует закрытый ключ.
// https://learn.microsoft.com/en-us/windows/win32/seccrypto/certificates-find
// bFindValidOnly [in, optional] - A Boolean value that indicates whether only valid certificates are returned
// ...но он может не сработать, потому что у CryptoPto не стандартные крипто-алгоритмы для проверки цепи
if (Certs.Count > 0) {
Certs = Certs.Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY(), CAPICOM_PROPID_KEY_PROV_INFO(), true);
}
/* не должно быть нужно, потому что TRUE выше
// Из них выбираются только сертификаты, действительные в настоящее время.
if (Certificates.Count > 0) {
Certificates = Certificates.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID);
} */
if (Certs.Count == 0) UserMessageErrAbort("Нет действующих сертификатов для выполнения операции подписания."
+ "\r\nУбедитесь, что сертификаты CryptoPro установлены в систему.");
var Cert1 = LStr? FindSignCert(Certs, LStr) : SelectSignCert(Certs);
if (Cert1 == undefined) UserMessageErrAbort("Не удалось найти сертификат ЭЦП для подписи документа."); // last chance, should never be
return Cert1;
}
// private
function FindSignCert(Certs, ASN)
{
var Cert1, C1SN, LSN = ASN.trim().toLowerCase();
for(Cert1 in Certs) {
C1SN = Cert1.SerialNumber.trim().toLowerCase();
if (C1SN === LSN) return Cert1;
};
UserMessageErrAbort("Не удалось найти сертификат ЭЦП с номером: " + LSN );
}
// private
function SelectSignCert(Certs)
{
if (Certs.Count == 1) return Certs(1);
try {
Certs = Certs.Select("Список установленных сертификатов", "Выберите сертификат для осуществления подписания:");
} catch (ax_err) {
if (-2138568446 == ax_err.number) { // ax_err.message == "The requested operation has been cancelled by the user."
Certs = {Count: 0};
} else {
throw ax_err;
}
}
if (Certs.Count == 0) UserMessageErrAbort("Выбор сертификата для подписания был отменен пользователем.");
return Certs(1);
}
Я подозревал, что сертификат - мертвый объект, потому что Store освобождён, подобные приколы за майкрософтом водятся, но в примерах везде освобождают коллекции сертификатов до использования...Security Update KB931906 Отредактировано пользователем 13 февраля 2024 г. 17:43:12(UTC)
| Причина: Не указана
|