需要帮助才能通过模板检索Windows证书?

时间:2017-02-01 14:47:50

标签: c++ winapi ssl-certificate x509certificate

我需要使用Windows API,C ++按模板名称(模板位于扩展字段中)检索Windows证书。

我的步骤:

  1. 打开商店:CertOpenStore(..)(完成;我可以使用CertEnumCertificatesInStore(..)枚举证书,但我只看到他们的“版本1字段”而不是“扩展”。模板在扩展,所以我找不到它。)

  2. 我尝试使用CertFindCertificateInStore()找到它,但没有成功。任何人都可以帮我找到正确的查找类型和参数或使用其他功能吗?

  3. CertFreeCertificateContext(..),CertCloseStore(..)(完成)。

1 个答案:

答案 0 :(得分:0)

我想发布我的代码,希望它可以帮助某人。

void GetCertificateByTemplate(char *certificateTemplate)
{
    HCERTSTORE          hCertStore;
    PCCERT_CONTEXT      pCertContext = NULL;
    BYTE               *pbDecoded;
    DWORD               cbDecoded;
    _CERT_TEMPLATE_EXT *pbDecodedTemplate = NULL;

    // 1). Open Local Machine certificate store
    if (hCertStore = CertOpenStore(
        CERT_STORE_PROV_SYSTEM,
        0,
        NULL,
        CERT_SYSTEM_STORE_LOCAL_MACHINE,
        L"My"))
    {
        fprintf(stderr, "The store has been opened. \n");
    }

    // 2). Enumerate certificates
    while (pCertContext = CertEnumCertificatesInStore(
        hCertStore,
        pCertContext))
    {
        // 3). Check certificate extended data
        for (int i = 0; i < pCertContext->pCertInfo->cExtension; i++)
        {
            // 4). Decode certificate extended data
            if (CryptDecodeObject(
                X509_ASN_ENCODING,
                pCertContext->pCertInfo->rgExtension[i].pszObjId,
                pCertContext->pCertInfo->rgExtension[i].Value.pbData,
                pCertContext->pCertInfo->rgExtension[i].Value.cbData,
                0,
                NULL,
                &cbDecoded))
            {
                ; // error !!!
            }
            if (!(pbDecoded = (BYTE*)malloc(cbDecoded)))
            {
                ; // error !!!
            }
            if (CryptDecodeObject(
                X509_ASN_ENCODING,
                pCertContext->pCertInfo->rgExtension[i].pszObjId,
                pCertContext->pCertInfo->rgExtension[i].Value.pbData,
                pCertContext->pCertInfo->rgExtension[i].Value.cbData,
                0,
                pbDecoded,
                &cbDecoded))
            {
                pbDecodedTemplate = (_CERT_TEMPLATE_EXT*)pbDecoded;

                char* objectId = pbDecodedTemplate->pszObjId;

                // todo: check pDecodeTemplate->pszObjId

                // 5). Compare the template string with the search one
                if (strcmp(pbDecodedTemplate->pszObjId, certificateTemplate) == 0)
                {
                    // todo: return certificate
                    printf("\nCertificate template found: %s \n", pbDecodedTemplate->pszObjId);   
                    break;
                }
            }
        }
    }

    // 6). Free certificate, close store
    if (pCertContext)
    {
        CertFreeCertificateContext(pCertContext);
    }
    CertCloseStore(hCertStore, 0);
}