Проблема в CryptoPro CSP
КриптоПро CSP библиотека имеет особенность работы с контейнерами и
криптоконтекстами: если криптоконтейнер существует, и
CryptAcquireContext вызывается с флагом CRYPT_NEWKEYSET, то код
возврата false и GetLastError() возвращает 0x8009000f (NTE_EXISTS),
и, дополнительно, пишет в syslog
Jul 29 10:24:19 vbox cprdr[22554]: cpcsp:!carrier_shortcut!rdr_shortcut_get fail!
Jul 29 10:24:19 vbox cprdr[22554]: cpcsp:!CreateContainer!CreateContainer: key_carrier_open faild!!
что нервирует клиентов. Если же контейнер не существует, а
CryptAcquireContext вызывается без флага CRYPT_NEWKEYSET, то код
возврата тоже false, и GetLastError() 0x80090019 (NTE_KEYSET_NOT_DEF)
и текст в syslog
Jul 29 10:30:36 vbox cprdr[22626]: cpcsp:!read_keyset!code==RDR_ERR_FILE_NOT_FOUND fail!
Jul 29 10:30:36 vbox cprdr[22626]: cpcsp:!OpenContainer!OpenContainer key_carrier_open fail (0x80090019)!
Да, можно искать существующие контейнеры через CryptGetProvParam с
флагами CRYPT_FIRST/CRYPT_NEXT, и это работает с контейнерами, которые
сохранены на диске. Но не работает с контейнерами, которые только
созданы, но ещё не сохранены на диск. А сохраняются они на диск
только если на них созданы ключи.
Одно из решений -- перехватывать вызовы CryptAcquireContext и
CryptReleaseContext и использовать кеш криптоконтекстов и имён
криптоконтейнеров для разрешения конфликтов существования/отсутствия.
no subject
no subject
cpconfig -loglevel cprdr -mask 0x0; cpconfig -loglevel cprdr -format 0x0
,но неспортивно.