| ||||
| ||||
Уважаемый All! Встала передо мной такая задача: необходимо периодически проверять наличие карты в считывателе. Притом работать всё это должно из-под Java-апплета... Какие предпринял действия: написал апплет, кот. периодически запускает на выполнение следующий JScript код с HTML-странички: <script language="JScript"> // CAPICOM константы. var CAPICOM_CURRENT_USER_STORE = 2; var CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY = 6; var CAPICOM_CERTIFICATE_FIND_TIME_VALID = 9; var CAPICOM_VERIFY_SIGNATURE_ONLY = 0; var CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT = 0; var CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1; var CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY = 2; var CAPICOM_PROPID_KEY_PROV_INFO = 2; var STORE_NAME = "MY"; var DETACHED = true; function check(pkey) { // Возвращаемое значение открытого ключа var ret_pkey = ""; // Текущий сертификат var Certificate = null; // Открываем хранилище var Store = new ActiveXObject("CAPICOM.Store"); Store.Open(CAPICOM_CURRENT_USER_STORE, STORE_NAME); // В качестве кандитатов на сертификат, на котором будет осуществлена подпись, // изначально определяются все сертификаты хранилища. var Certificates = Store.Certificates; // Из них не рассматриваются сертификаты, в которых отсутствует закрытый ключ. if (Certificates.Count > 0) { Certificates = Certificates.Find(CAPICOM_CERTIFICATE_FIND_EXTENDED_PROPERTY, CAPICOM_PROPID_KEY_PROV_INFO); } // Из них выбираются только сертификаты, действительные в настоящее время. if (Certificates.Count > 0) { //Certificates = Certificates.Find(CAPICOM_CERTIFICATE_FIND_TIME_VALID, new Date()); } // Выбор сертификата для подписи. Если после проведенной фильтрации осталось несколько кандидатов, // то пользователю предоставляется выбор одного из них (при помощи диалогового окна). switch (Certificates.Count) { case 0: alert("ОШИБКА: в личном хранилище сертификатов не найден подходящий сертификат!"); break; case 1: Certificate = Certificates.Item(1); break; default: //document.write("pkey = '" + pkey + "'"); //document.write("certificates count = '" + Certificates.Count + "'"); if (pkey != "-1") { for (var i = 1; i < Certificates.Count + 1; i++) { //document.write("current pkey = '" + Certificates.Item(i).PublicKey().EncodedKey.Value + "'"); if (Certificates.Item(i).PublicKey().EncodedKey.Value == pkey) { Certificate = Certificates.Item(i); break; } } } else { Certificates = Certificates.Select(); if (Certificates.Count > 0) { Certificate = Certificates.Item(1); } } } if (Certificate != null) { ret_pkey = Certificate.PublicKey().EncodedKey.Value; } Strore = null; Certificates = null; return ret_pkey; } Только вот незадача: открытый ключ достаётся прямо из хранилища, и обращения к карте не происходит... А считывать постоянно закрытый ключ с карты -- не представляется возможным, ибо пользователю придётся при каждом опросе вводить пин-код... Нельзя ли настроить систему так, чтобы и открытый ключ запрашивался с карточки? Хорошо понимаю, что данный скрипт работает с библиотекой capicom, документацию на msdn'е почитал... Но другого способа, как узнать о наличии карты в устройстве я пока не вижу... Может, кто-то сможет подсказать мне другой вариант? | ||||
Ответы: | ||||
| ||||
Hello! Good Site! Thanks you! djhbmdkgbv | ||||