Как получить имя провайдера CSP от PCCERT_CONTEXT? - PullRequest
1 голос
/ 15 октября 2011

Я пытался получить имя провайдера от PCCERT_CONTEXT, потому что в моем текущем проекте я должен загрузить все сертификаты со смарт-карты в мою программу.И в будущем мне придется иметь дело с этими сертификатами с помощью некоторой задачи, такой как обновление сертификата, удаление сертификата.Но у меня есть проблема, я должен сопоставить имя CSP и имя провайдера с CryptAcquireContext для руководителя.И я в настоящее время запутался, как архивировать это, может у кого-нибудь есть какое-нибудь руководство, которое поможет мне решить эту проблему.Я пробовал CertGetCertificateContextProperty с dwPropId CERT_KEY_PROV_INFO_PROP_ID, но я не могу получить CRYPT_KEY_PROV_INFO.

1 Ответ

2 голосов
/ 17 октября 2011

Если я правильно вас понял, в следующем фрагменте показано, как извлечь информацию о поставщике ключей из сертификата.

void trace(char* message, DWORD errorCode)
{
    cout << message << errorCode;
}

std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext)
{
    DWORD dwSize = 0;    
    BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                        CERT_KEY_PROV_INFO_PROP_ID,
                                                        NULL,
                                                        &dwSize);
    if (!bIsSuccess)
    {
        trace("CertGetCertificateContextProperty failed with error: ", GetLastError());
        return L"";
    }

    PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize);
    if (pKeyProvInfo == NULL)
    {
        trace("LocalAlloc failed with error:", GetLastError());
        return L"";
    }

    bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                   CERT_KEY_PROV_INFO_PROP_ID,
                                                   pKeyProvInfo,
                                                   &dwSize);

    std::wstring provName;
    if (bIsSuccess)
    {
        provName = pKeyProvInfo->pwszProvName;
    }

    LocalFree(pKeyProvInfo);

    return provName;
}
...