【问题标题】:How do i get Certificate Trust List on windows7 using CryptoAPI如何使用 CryptoAPI 在 windows7 上获取证书信任列表
【发布时间】:2013-08-09 14:45:22
【问题描述】:

我想使用 Crypto API 在 Windows7 上获取 CTL(证书信任列表),我使用 CertFindCTLInStore 函数,但它总是返回 false;GetLastError() 函数返回 -2146885682,我不知道我哪里做错了. 代码如下:

hCertStore = CertOpenSystemStore( 空值, pszStoreName);

if(NULL != hCertStore)
{
    char buffer[8*1024];
    memset(buffer,0,sizeof(buffer));
    PCCTL_CONTEXT pCTL = CertCreateCTLContext(
                         X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
                         (const BYTE*)buffer,
                         sizeof(buffer));
    CTL_FIND_USAGE_PARA usagePara;
    //first
    pCTL =  CertFindCTLInStore(
            hCertStore, 
            X509_ASN_ENCODING|PKCS_7_ASN_ENCODING,
            0,
            CTL_FIND_ANY,
            NULL,
            NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }


    //Second 
    CRYPT_HASH_BLOB cryBlob;
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_SHA1_HASH,
        &cryBlob, 
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }


    //third
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_MD5_HASH,
        &cryBlob, 
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }

    //fourth
    CTL_FIND_USAGE_PARA ctlPara;
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_USAGE,
        &ctlPara,
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }


    //fifth
    CTL_FIND_USAGE_PARA ctlPara2;
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_SAME_USAGE_FLAG,
        &ctlPara2, 
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }


    //six
    CTL_CONTEXT ctlText;
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_EXISTING,
        &ctlText, 
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }

    //seven
    CTL_FIND_SUBJECT_PARA ctlSubPara;
    pCTL =  CertFindCTLInStore(
        hCertStore, 
        X509_ASN_ENCODING|PKCS_7_ASN_ENCODING, 
        0,
        CTL_FIND_SUBJECT,
        &ctlSubPara, 
        NULL);

    if (NULL != pCTL)
    {
        printf("Find a CTL\n");
    }
    else
    {
        printf("Error Code :%d\n",GetLastError());
    }

【问题讨论】:

    标签: c++ windows certificate cryptoapi


    【解决方案1】:

    我敢打赌,你得到的不是 -2146885682,而是 -2146885628,又名 0x80092004 又名 CRYPT_E_NOT_FOUND。很简单,商店里没有 CTL。

    【讨论】:

    • 是的,你说的对,你有没有简单的这个函数调用成功。我只是不明白为什么MSDN不给出一个简单的例子使用这个函数。他们只是给出一个简单的例子说将证书更改为 CRL,我只是找不到可以工作的示例
    • 您的代码有效,并成功报告商店中没有 CTL。是什么让你相信应该有一些?如果要获取所有受信任的根CA的证书,请使用CertOpenSystemStore打开ROOT存储,然后使用CertFindCertificateInStore枚举证书。
    • 我按照你说的做,效果很好。我们枚举系统中的所有店铺,并选择信任的店铺。也许我只需要找到另一种解决问题的方法。跨度>
    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多