КриптоПро CSP 5.0 и извлекаемые ключевые носители
Опубликовано Наталья Мовчан on 2021-06-08 13:30

Данная статья содержит общую информацию о поддерживаемых КриптоПро CSP 5.0 ключевых носителях и связанном с ними функционале.

КриптоПро CSP 5.0 поддерживает три класса извлекаемых ключевых носителей (токенов и смарт-карт):

1) Пассивные - хранят ключ подписи под паролем. Для формирования подписи ключ зачитывается в оперативную память CSP.
2) ФКН без защиты канала (активные) - сами генерируют ключ, сами подписывают данные. CSP передает в токен на подпись документ и пароль. Канал между токеном/смарт-картом и криптопровайдером не защищен.
3) ФКН с защитой канала (с SESPAKE) - аналогичны "активным", но для аутентификации используют надежный протокол SESPAKE, в результате которого между токеном и криптопровайдером устанавливается защищенный канал.

Большинство активных токенов для целей совместимости с предыдущими версиями CSP можно использовать в нескольких режимах. Идентификатором режима является префикс уникального номера "апплета".

Например, при перечислении считывателей функцией CryptGetProvParam(PP_ENUMREADERS) токен Рутокен ЭЦП 2.0 3000 будет отображен как три носителя:

rutoken_fkc_XXXXXXX - ФКН с защитой канала;
rutoken_crypt_XXXXXXX - ФКН без защиты канала;
rutoken_ecp_XXXXXXX - пассивный.

 

КриптоПро CSP 5.0 поддерживает функциональность, которая позволяет ограничивать допустимые для использования режимы работы.

Для этого используется функция CryptSetProvParam(PP_CARRIER_TYPES).

Пример использования:

CRYPT_CARRIER_TYPES types;
types.enabled_types = ENABLE_CARRIER_TYPE_CSP;
types.enabled_operations = DISABLE_EVERY_CARRIER_OPERATION;
CryptSetParam(hProv, PP_CARRIER_TYPES, (BYTE*)&types, 0);

Допустимые значения enabled_types (можно комбинировать через побитовое ИЛИ):

ENABLE_CARRIER_TYPE_CSP - разрешить использование носителей обычных пассивных криптоконтейнеров (CSP 3.6 - CSP 4.0);
ENABLE_CARRIER_TYPE_FKC_NO_SM - разрешить использование ФКН без SM (Рутокен ЭЦП, JaCarta ГОСТ и т.п.);
ENABLE_CARRIER_TYPE_FKC_SM - разрешить использование ФКН с SM (SESPAKE).

Допустимые значения enabled_operations (можно комбинировать через побитовое ИЛИ):

DISABLE_EVERY_CARRIER_OPERATION - запрещены любые операции с неуказанными в enabled_types носителями;
ENABLE_CARRIER_OPEN_ENUM - запрещено создавать ключи на неуказанных в enabled_types носителях;
ENABLE_CARRIER_CREATE - запрещено использовать (но не создавать) ключи на неуказанных в enabled_types носителях.

 

КриптоПро CSP 5.0 R2 дополнительно поддерживает функциональность, которая позволяет ограничить допустимые для использования конкретные режимы работы конкретных носителей.

Для этого используется функция CryptSetProvParam(PP_UNIQUE_FILTER). Она принимает аргументом регулярное выражение, которое накладывается на уникальный номер "апплета".

Например, если стоит задача "разрешить только Рутокен Лайт и Рутокен ЭЦП 2.0, но на Рутокен ЭЦП 2.0 создавать только в активном режиме", вызов будет выглядеть так:

const char* regex = ".*(rutoken_crypt|rutoken_lt).*";
CryptSetParam(hProv, PP_UNIQUE_FILTER, (BYTE*)regex, 0);

Аналогичное условие для JaCarta LT и JaCarta-2 ГОСТ:

".*(JACARTA_Crypt|JACARTA_LT).*"

Выражение, по которому можно использовать все носители кроме указанных выше:
"^(?!(JACARTA_Crypt|JACARTA_LT|rutoken_crypt|rutoken_lt)).*"

 

Кроме фильтрации по уникальным номерам КриптоПро CSP 5.0 поддерживает возможность установки поддерживаемых типов носителей.

Например, разрешить работу только со смарт-картами.

Для этого используется функция CryptSetProvParam(PP_MEDIA_TYPE), которая принимается в качестве аргумента тип, носители которого будут разрешены в данном процессе.
Возможные варианты: SCARD (смарт-карты и токены), REGISTRY (реестр), FAT12 (флеш-накопители и съемные диски), CLOUD (облачные ключи) и т.д.

 

Начиная с версии КриптоПро CSP 5.0 R2 11998 для работы с носителями Рутокен ЭЦП 2.0, JaCarta-2 ГОСТ и ESmart Токен ГОСТ используются библиотеки PKCS#11.

Работа через них является аналогом режимов rutoken_crypt/jacarta_crypt/esmart_hw(ФКН без защиты канала), но идентификаты режимов получили префикс "pkcs11_".
Для этих версий вызов должен выглядеть так:

const char* regex = ".*(pkcs11_rutoken|rutoken_crypt|rutoken_lt).*";
CryptSetParam(hProv, PP_UNIQUE_FILTER, (BYTE*)regex, 0);

 

О способах генерации неизвлекаемых ключей на активных токенах  и обычных ключей на пассивных токенах с помощью КриптоПро ЭЦП Browser plug-in можно почитать в статье

 

(6 плюсик(ов))
Класс!
Не очень :(

Коментарии (0)