Почему сертификат в хранилище сертификатов не имеет свойства закрытого ключа - PullRequest
0 голосов
/ 08 апреля 2020

Я попытался получить 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 свойства?

1 Ответ

1 голос
/ 08 апреля 2020

Сертификаты подписаны публичными c ключами, они не содержат секретный ключ. Большая часть путаницы проистекает из случайного неправильного использования и смешения терминологии и понятий людьми, которые не понимают криптографию должным образом.

Например, .cert .cer .crt может содержать ключей и / или сертификаты . Однако строго certificate является подписью publi c key .

...