| ||||
| ||||
На сколько я понял из примера csptest для получения провайдера по сертификату как для создания подписи так и для её проверки рекомендуется использовать CryptAcquireCertificatePrivateKey, но тут возникает следующая проблема - если на машине существует сертификат с закрытым ключом, то требуется ввести пароль для доступа к закрытому ключу, что при проверке подписи является несколько избыточным. Подскажите есть ли другой способ получения провайдера по сертификату именно для проверки подписи ? | ||||
Ответы: | ||||
| ||||
Для проверки подписи не требуется доступ к закрытому ключу. Можно использовать CryptAcquireContext с параметром CRYPT_VERIFYCONTEXT. В примере использован вызов CryptAcquireCertificatePrivateKey для автовыбора параметров контекста, а именно, имени и типа CSP, которые берутся из сертификата. Вы можете использовать: для КриптоПро CSP 1.1: CryptAcquireContext(&hProv, NULL, NULL, 2, CRYPT_VERIFYCONTEXT) для КриптоПро CSP 2.0: CryptAcquireContext(&hProv, NULL, NULL, 2, CRYPT_VERIFYCONTEXT) или, для ГОСТ Р 34.10-94 CryptAcquireContext(&hProv, NULL, NULL, 71, CRYPT_VERIFYCONTEXT) или, для ГОСТ Р 34.10-2001 CryptAcquireContext(&hProv, NULL, NULL, 75, CRYPT_VERIFYCONTEXT) | ||||
| ||||
Спасибо, уверен что это сработает. Но в этом случае придется выбирать провайдер независимо от сертификата, я пробовал получить провайдер через свойства аля CERT_KEY_PROV_INFO_PROP_ID, но оно не всегда есть (например после установки сертификата без закрытого ключа). Вы не подскажите каким образом функции высокого уровня все-таки получают нужный провайдер по сертификату ? | ||||
| ||||
Однозначного решения здесь быть не может. Как правило, есть несколько криптопровайдеров, которые умеют работать с определенным алгоритмом ключа, записанным в сертификате - поле CRYPT_ALGORITHM_IDENTIFIER в SubjectPublicKeyInfo структуры CERT_INFO. Если OID алгоритма - один из зарегистрированных для ГОСТ Р 34.10-94(2001) - 1.2.643.2.2.20, 1.2.643.2.2.19 - то можно использовать наш CSP (соответственно, 71 и 75). | ||||