Основные особенности отображения пользовательского UI
Использование CryptoAPI в "тихом" режиме.
В данном разделе описаны ситуации, когда может потребоваться "тихий" режим, а также о том, как его использовать.
Суть проблемы
В ряде случаев требуется минимизировать взаимодействие с пользователем. При использовании CryptoAPI в некоторых случаях может потребоваться действие пользователя:
-
Если не указано полное имя контейнера.
-
Если для генерации ключа используется БиоДСЧ или другой, требующий действий пользователя.
-
Если требуется ввод пин-кода или аналогичное действие для осуществления аутентификации.
-
Если провайдер должен отобразить окно с критической информацией (лицензия недействительна или отсутствует, срок действия алгоритма заканчивается и т.д.).
"Тихий" режим позволяет выполнить операцию без взаимодействия с пользователем.
Как заставить программу работать в "тихом" режиме
Существуют несколько способов:
-
Указать необходимую информацию полностью. Например, указать пин-код перед выполняемой операцией или полное имя контейнера наподобие \\.\REGISTRY\test_container (см. "Имя контейнера")).
-
Использовать генераторы, не требующие взаимодейстия с пользователем (например, аппаратные или КриптоПро Исходный Материал).
-
Решить проблему, по причине которой провайдер выбрасывал окна (например, ввести лицензию).
-
Использовать соответствующие флаги в CryptoAPI функциях:
-
CryptAcquireContext - CRYPT_SILENT
Можно задать этот флаг глобально для всех операций:
на 32-х битной Windows выполнить в коммандной строке с правами администратора:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters" /v force_silent /t REG_DWORD /d 1 /f
на 64-х битной Windows выполнить в коммандной строке с правами администратора:
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Crypto Pro\Cryptography\CurrentVersion\Parameters" /v force_silent /t REG_DWORD /d 1 /f
для остальных ОС выполнить в консоли с правами администратора из папки, содержащей утилиту cpconfig:
./cpconfig -ini '' -add long force_silent 1
Если дальнейшие вызовы функций криптопровайдера требуют отображения графического интерфейса, то криптопровайдер возвратит ошибку NTE_SILENT_CONTEXT.
-
CryptAcquireCertificatePrivateKey - CRYPT_ACQUIRE_SILENT_FLAG
-
CryptSignMessage - CRYPT_MESSAGE_SILENT_KEYSET_FLAG в dwFlags структуры CRYPT_SIGN_MESSAGE_PARA
-
CryptDecryptMessage - CRYPT_MESSAGE_SILENT_KEYSET_FLAG в dwFlags структуры CRYPT_DECRYPT_MESSAGE_PARA
В утилитах реализован ключ -silent, который позволяет выполнить операцию в "тихом" режиме.