06.04.2007 10:49:16Проблема использования открытого ключа для проверки подписи Ответов: 1
Денис
// нашел чужой сертификат в хранилище
F_phCert = CertFindCertificateInStore(F_hCertStore, MY_CERT_ENCODING, 0, CERT_FIND_SUBJECT_NAME, &cn, NULL);
if(!F_phCert) ThrowLastErrorString("CertFindCertificateInStore()");
/*
// Попытка проверить возможность использования открытого ключа
if(!CryptAcquireCertificatePrivateKey(F_phCert, MY_ACQUIRE_FLAG, NULL, &F_hCrProv, &dwKeySpec, &fCallerFreeProv)) ThrowLastErrorString("CryptAcquireCertificatePrivateKey()");
// функция выдает ошибку (LastError=-2146885621 (0x8009200B))
if(!fCallerFreeProv) ThrowStringException("Certificate Public Key Is Not Usable.");
*/
// если CryptAcquireCertificatePrivateKey пропустить, то следующая функция дает ошибку (LastError=87 (0x57))
if(!CryptImportPublicKeyInfo(F_hCrProv, MY_CERT_ENCODING, &(F_phCert->pCertInfo->SubjectPublicKeyInfo), &F_hUserKey)) ThrowLastErrorString("CryptImportPublicKeyInfo()");

#define MY_ACQUIRE_FLAG (CRYPT_ACQUIRE_COMPARE_KEY_FLAG | CRYPT_ACQUIRE_SILENT_FLAG)
или
#define MY_ACQUIRE_FLAG CRYPT_ACQUIRE_SILENT_FLAG

Эти же функции для такого же моего сертификата, но при наличии секретного ключа работают.
 
Ответы:
09.04.2007 11:57:45Василий
Я так полагаю, потому, что хендл F_hCrProv не инициализирован (т.к. предыдущая функция вернула ошибку).
Инициализируйте его без доступа к секретному ключу:
CryptAcquireContext(&F_hCrProv,NULL,NULL,тип CSP,CRYPT_VERIFYCONTEXT), где тип CSP - 75 для ГОСТ Р34.10-2001