Я попытался получить E C закрытый ключ из сертификата, который находится в хранилище сертификатов по API CNG. Сначала я вызываю CertGetCertificateContextProperty()
, чтобы получить дескриптор закрытого ключа со свойством CERT_KEY_CONTEXT_PROP_ID
, но он всегда возвращает false. Я уверен, что у сертификата есть закрытый ключ.
Код:
wchar_t wMY_CERT_NAME[100];
HCERTSTORE hCertStore = NULL;
PCCERT_CONTEXT pSignerCert = NULL;
NCRYPT_KEY_HANDLE hKey = NULL;
const int buffsize = 4999;
DWORD len = buffsize;
char buff[buffsize];
// Open the certificate store.
if (!(hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME)))
{
MyHandleError(const_cast<LPTSTR>("The MY store could not be opened."));
}
swprintf(wMY_CERT_NAME, 100, L"%hs", MY_CERT_NAME);
if (pSignerCert = CertFindCertificateInStore(
hCertStore,
MY_ENCODING_TYPE,
0,
CERT_FIND_SUBJECT_STR,
wMY_CERT_NAME,
NULL))
{
//continue
}
if (CertGetCertificateContextProperty(
pSignerCert,
CERT_KEY_CONTEXT_PROP_ID,
buff,
&len))
{
auto ckc = (CERT_KEY_CONTEXT *)buff;
hKey = ckc->hNCryptKey;
}
else {
wprintf(L"**** GetCertContextProperty failed.\n");
}
Затем я попытался сделать тот же шаг, но прочитал из файла .pfx, например на этой странице . Возвращает true и успешно получает закрытый ключ. Почему сертификат в хранилище сертификатов не имеет CERT_KEY_CONTEXT_PROP_ID
свойства?