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