18.06.2007 13:32:21наличие карты в кард-ридере Ответов: 1
grumbler
Уважаемый 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'е почитал...
Но другого способа, как узнать о наличии карты в устройстве я пока не вижу...
Может, кто-то сможет подсказать мне другой вариант?
 
Ответы:
13.08.2007 0:35:38zgepxjcpno
Hello! Good Site! Thanks you! djhbmdkgbv