获取"密钥用法"来自证书

时间:2015-10-14 15:27:01

标签: c++ winapi cryptography

我可以使用什么API来获取"密钥用法"从证书。我特别想知道一个给定的证书是否有"数字签名"或不。 下面的屏幕截图是Windows中证书的详细信息。我需要API来提供" Key Usage"。 代码用于Windows,我用C ++编写代码。

enter image description here

谢谢

萨姆

2 个答案:

答案 0 :(得分:3)

CertOpenStore开始,然后循环调用CertFindCertificateInStore,直到找到您感兴趣的证书。

返回的CERT_CONTEXT包含指向CERT_INFO结构的指针。然后,您将需要遍历rgExtension成员,该成员是CERT_EXTENSION个对象的数组。您关注的那个pszObjId设置为szOID_KEY_USAGE_RESTRICTION,然后会为您提供此数据:CERT_KEY_USAGE_RESTRICTION_INFO其中RestrictedKeyUsage成员具有您感兴趣的位标记。< / p>

您还可以查看szOID_KEY_USAGE扩展名,该扩展名将使用相同的位标记,但msdn documentation表示这些字段为

  

仅限咨询字段[s],并不暗示密钥的使用受到限制   达到指示的目的

根据您需要的信息,您可以使用任一扩展名。

答案 1 :(得分:2)

Josh Poley 的帮助下,我找到了答案。谢谢 Josh

bool CertHasDigitalSignature(PCCERT_CONTEXT pCert)
{
    bool retVal(false);
    CERT_EXTENSION* keyUsage;

    keyUsage = CertFindExtension(szOID_KEY_USAGE, pCert->pCertInfo->cExtension, pCert->pCertInfo->rgExtension);
    if(NULL != keyUsage)
    {
        DWORD strSz(0);

        if(CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, szOID_KEY_USAGE, keyUsage->Value.pbData ,keyUsage->Value.cbData, NULL, &strSz))
        {
            std::wstring Buff;

            Buff.resize((strSz / sizeof(wchar_t)) + 1);
            if(CryptFormatObject(X509_ASN_ENCODING, 0, 0, NULL, szOID_KEY_USAGE, keyUsage->Value.pbData ,keyUsage->Value.cbData, (void*)Buff.data(), &strSz))
            {
                if (std::wstring::npos != Buff.find(L"Digital Signature"))
                    retVal = true;
            }
        }
    }
    return retVal;
}