首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要帮助通过模板检索Windows证书吗?

需要帮助通过模板检索Windows证书吗?
EN

Stack Overflow用户
提问于 2017-02-01 14:47:49
回答 1查看 379关注 0票数 0

我需要使用Windows,C++,通过模板名(模板在扩展字段中)检索。

我的脚步:

  1. 开店: CertOpenStore(..)(已完成;我可以使用CertEnumCertificatesInStore(..)枚举证书,但我只看到它们的"Version 1字段“,而没有看到”扩展“。模板在扩展中,所以我找不到它。)
  2. 我试图使用CertFindCertificateInStore()找到它,但没有成功。有人能帮我找到正确的类型和参数或使用其他函数吗?
  3. CertFreeCertificateContext(..),CertCloseStore(.)(已完成)。
EN

回答 1

Stack Overflow用户

发布于 2017-02-02 13:05:44

我想贴我的代码,希望它能帮助到别人。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41982617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档