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