Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73  Сказал(а) «Спасибо»: 2 раз
|
https://cpdn.cryptopro.r.../class_certificates.htmlтеоретически на вашем Store должен работать Open JScript (3rd edition, WSH)
Код:// 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.number + " (" + CertsStoreObjName + ")\r\n" + err.description);
}
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
// перестраховка для Win32, получить сертификат из не-Майкрософт хранилища
if (!LStr) {
try {Cert1 = GetUserSignCert(Cert1.SerialNumber);}
catch(err) {UserMessageErr("Выбранный в Windows сертификат не найден в хранилище Crypto-Pro/" + CertsStoreObjName); throw err;};
};
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);
}
Сначала функция вызывается с пустой строкой, потом сама себя вызывает с серийником (только что второй проход добавил). На открытии вашего кастомного хранилища - ошибка. P.S. poor man's constants:
Код:// private
// CryptoPro: В методе Open для параметра Location поддерживаются значения CAPICOM_CURRENT_USER_STORE, CAPICOM_LOCAL_MACHINE_STORE и CADESCOM_CONTAINER_STORE.
function CAPICOM_CURRENT_USER_STORE() {return 2}; // https://learn.microsoft.com/en-us/windows/win32/seccrypto/capicom-store-location
function CAPICOM_LOCAL_MACHINE_STORE() {return 1};
function CADESCOM_CONTAINER_STORE() {return 100}; // https://cpdn.cryptopro.ru/default.asp?url=content/cades/namespace_c_ad_e_s_c_o_m_108767955f739e6b1502fa7b24f7a1e4_1108767955f739e6b1502fa7b24f7a1e4.html
function CAPICOM_STORE_OPEN_READ_ONLY() {return 0}; // https://learn.microsoft.com/en-us/windows/win32/seccrypto/capicom-store-open-mode
function CAPICOM_STORE_OPEN_READ_WRITE() {return 1};
function CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED() {return 2};
// https://cpdn.cryptopro.ru/content/cades/plugin-samples-fileapi.html
// https://github.com/splincode/cryptopro-browser-plugin/blob/master/examples/index.html
function CAPICOM_MY_STORE() {return "My"};
function CADESCOM_CADES_X_LONG_TYPE_1() {return 93}
function CADESCOM_CADES_BES() {return 1}
function CADESCOM_CADES_DEFAULT() {return 0}
function CADESCOM_BASE64_TO_BINARY() {return 1}
function CAPICOM_ENCODE_BASE64() {return 0} // https://learn.microsoft.com/en-us/windows/win32/seccrypto/capicom-encoding-type
// https://learn.microsoft.com/en-us/windows/win32/seccrypto/capicom-certificate-find-type
function CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY() {return 6}
function CAPICOM_CERTIFICATE_FIND_TIME_VALID() {return 9}
function CAPICOM_PROPID_KEY_PROV_INFO() {return 2}
// https://learn.microsoft.com/en-us/windows/win32/seccrypto/capicom-certificate-include-option
function CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT() {return 0}
function CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN() {return 1}
function CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY() {return 2}
Цитата:CertsStoreObjName == "CAdESCOM.Store" CertsStorageID == 2 CAPICOM_STORE_OPEN_READ_ONLY() == 0 CAPICOM_MY_STORE() == "My"
var Store = new ActiveXObject(CertsStoreObjName); Store.Open(CertsStorageID, CAPICOM_MY_STORE(), CAPICOM_STORE_OPEN_READ_ONLY());
И тут сразу
Ошибка применения ЭЦП CryptoPro
-2147467263 (CAdESCOM.Store) Не поддерживается
ОК
В DBGVIEW на этой строчке тишина, то есть у вас проблема именно в поиске интерфейса по TLB Возможно рассыпается цепочка делегирования, если от одного GUID идти к другому чуть разными путями - то получаются разные объекты...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,712   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: MWB Dmitry  Автор: Андрей *  Пробовали установить в среду, сгенерировать pas tlb, требование сверху - так не делать, и делать все на WSH, "не в ядре, а в конфигурации" чисто для теста... может завтра сделаю, времени нет сейчас совсем Цитата:невизульными компонентами проверить работу? пока все в JScript с запуском внутри своего EXE следовательно - никакой визуальщины В Delphi x32 все работает. Regsrv нужно запускать нужной битности, автоматически не зарегистрировалась? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73  Сказал(а) «Спасибо»: 2 раз
|
Update проверил на относительно чистой Win7, где крипто-про если когда и был, то очень давно в составе DiaDoc, а может и вообще не было. После Store.Open действительно CAPICOM ведёт себя так. Буем считать стандартным поведением.
все DLL загрузились дважды  procexp64_pqytBbDOYp.png (16kb) загружен 3 раз(а).или это теперь для Windows норма, какие-нибудь address space randomization? или ресурсы ?
Код:Info at address: 14110000
AllocationBase: 14110000
RegionSize: 132 K
Type: Mapped
Access: R
Initail Access: R
Shared: True
Shared count: 7
Mapped file: C:\Program Files (x86)\Common Files\Microsoft Shared\CAPICOM\capicom.dll
-------------------------------------------- Memory dump -------------------------------------------------
14110000: 62 02 88 80 8E 14 00 00 | 70 02 88 80 96 14 00 00 b....p....
14110010: 71 02 88 80 97 14 00 00 | 80 02 88 80 A0 14 00 00 q..... ...
14110020: 81 02 88 80 A1 14 00 00 | 82 02 88 80 A2 14 00 00 .¡....¢...
14110030: 83 02 88 80 A3 14 00 00 | 90 02 88 80 AA 14 00 00 .£....ª...
14110040: 91 02 88 80 AB 14 00 00 | 92 02 88 80 AC 14 00 00 .«....¬...
14110050: 00 09 88 80 0C 17 00 00 | 01 09 88 80 0D 17 00 00 ............
14110060: 02 09 88 80 0E 17 00 00 | 03 09 88 80 0F 17 00 00 ............
Код:Info at address: 6DF10000
AllocationBase: 6DF10000
RegionSize: 4 K
Type: Image
Access: R
Initail Access: RE, Write copy
Shared: True
Shared count: 7
Mapped file: C:\Program Files (x86)\Common Files\Microsoft Shared\CAPICOM\capicom.dll
------------------------------------------ IMAGE_DOS_HEADER ----------------------------------------------
6DF10000: 4D 5A e_magic = "MZ" // Magic number
6DF10002: 90 00 e_cblp = 90 // Bytes on last page of file
6DF10004: 03 00 e_cp = 3 // Pages in file
6DF10006: 00 00 e_crlc = 0 // Relocations
Код:Info at address: 142E0000
AllocationBase: 142E0000
RegionSize: 76 K
Type: Mapped
Access: R
Initail Access: R
Shared: True
Shared count: 7
Mapped file: C:\Program Files (x86)\Common Files\Crypto Pro\Shared\cadescom.dll
-------------------------------------------- Memory dump -------------------------------------------------
142E0000: 27 43 41 64 45 53 43 4F | 4D 2E 58 35 30 39 45 6E 'CAdESCOM.X509En
142E0010: 72 6F 6C 6C 6D 65 6E 74 | 2E 43 43 65 72 74 69 66 rollment.CCertif
142E0020: 69 63 61 74 65 50 6F 6C | 69 63 79 2E 31 27 0D 0A icatePolicy.1'..
142E0030: 20 20 20 20 20 20 20 20 | 20 20 20 20 56 65 72 73 Vers
142E0040: 69 6F 6E 49 6E 64 65 70 | 65 6E 64 65 6E 74 50 72 ionIndependentPr
142E0050: 6F 67 49 44 20 3D 20 73 | 20 27 43 41 64 45 53 43 ogID = s 'CAdESC
142E0060: 4F 4D 2E 58 35 30 39 45 | 6E 72 6F 6C 6C 6D 65 6E OM.X509Enrollmen
142E0070: 74 2E 43 43 65 72 74 69 | 66 69 63 61 74 65 50 6F t.CCertificatePo
142E0080: 6C 69 63 79 27 0D 0A 20 | 20 20 20 20 20 20 20 20 licy'..
142E0090: 20 20 20 46 6F 72 63 65 | 52 65 6D 6F 76 65 20 27 ForceRemove '
Код:Info at address: 6B040000
AllocationBase: 6B040000
RegionSize: 4 K
Type: Image
Access: R
Initail Access: RE, Write copy
Shared: True
Shared count: 7
Mapped file: C:\Program Files (x86)\Common Files\Crypto Pro\Shared\cadescom.dll
------------------------------------------ IMAGE_DOS_HEADER ----------------------------------------------
6B040000: 4D 5A e_magic = "MZ" // Magic number
6B040002: 90 00 e_cblp = 90 // Bytes on last page of file
6B040004: 03 00 e_cp = 3 // Pages in file
6B040006: 00 00 e_crlc = 0 // Relocations
Отредактировано пользователем 14 февраля 2024 г. 11:06:29(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73  Сказал(а) «Спасибо»: 2 раз
|
A.S. вы до какого времени сегодня планируете?
> В Delphi x32 все работает.
в смысле, напрямую из паскалевского кода?
возможно. Тут похоже на шрёдинбаг, 9 лет назад его не нашли, теперь снова начинаем.
внутри вашего рантайма, вероятно, при некоторых условиях создается НЕ ТОТ объект, и дальше TLB не соответсвует реальному классу...
> Regsrv нужно запускать нужной битности, автоматически не зарегистрировалась?
да хрен его знает, я на всякий случай запускал, чтобы уж точно.
Повторяю, я перед этим удалил майкрософтоский capicom (выше и номер KB и версия и путь к DLL были) После этого у меня даже WScript пеhестал работать - слетели регистрации activex
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,712   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: MWB Dmitry  A.S. вы до какого времени сегодня планируете?
> В Delphi x32 все работает.
в смысле, напрямую из паскалевского кода?
возможно. Тут похоже на шрёдинбаг, 9 лет назад его не нашли, теперь снова начинаем.
внутри вашего рантайма, вероятно, при некоторых условиях создается НЕ ТОТ объект, и дальше TLB не соответсвует реальному классу...
> Regsrv нужно запускать нужной битности, автоматически не зарегистрировалась?
да хрен его знает, я на всякий случай запускал, чтобы уж точно.
Повторяю, я перед этим удалил майкрософтоский capicom (выше и номер KB и версия и путь к DLL были) После этого у меня даже WScript пеhестал работать - слетели регистрации activex Давно бы сделали или на форуме взять заготовки, раз в квартал, полгода кто-то пытается осознать, как с com работать в 202х годах. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,712   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
Хромиум приложение, так? На базе cef |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,712   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73  Сказал(а) «Спасибо»: 2 раз
|
если что у меня сейчас легаси на дельфи 2007 и каком-то самописном интерфейсе к WSH
на юникодные перейти не можем, там где-то чего-то наворотили и все сразу разваливается.
но это не должно сильно влиять, потому что все конвертации AnsiString <-> BSTR делаются снаружи модуля, а дальше уже идет чистый движок JScript
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,712   Сказал «Спасибо»: 574 раз Поблагодарили: 2303 раз в 1804 постах
|
Автор: MWB Dmitry  если что у меня сейчас легаси на дельфи 2007 и каком-то самописном интерфейсе к WSH
на юникодные перейти не можем, там где-то чего-то наворотили и все сразу разваливается.
но это не должно сильно влиять, потому что все конвертации AnsiString <-> BSTR делаются снаружи модуля, а дальше уже идет чистый движок JScript
Без разницы. Ссылка выше, там на 7ке написано и в современной, от 2024 работает. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 13.02.2024(UTC) Сообщений: 73  Сказал(а) «Спасибо»: 2 раз
|
CEF используется как немодальный редактор скрипта
при запуске EXE только ЭЦП (а для CEF - еще один процесс) та же фигня
не от хорошей жизни CEF запустили :-)
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close