我正在使用“CertOpenStore”API打开证书存储区,并使用“CertEnumCertificatesInStore”API获取证书。 API返回的CERT_CONTEXT数据以CERT_NAME_BLOB类型提供颁发者名称。 如何从证书中获取CERT_RDN或CERT_NAME_INFO。 我的要求是获取颁发者名称属性(O,OU等)。我不想解析CertNameToStr API返回的字符串。
答案 0 :(得分:2)
以上评论是正确的,您需要解码CERT_NAME_BLOB
中的ASN.1编码数据。但是,CryptoAPI具有为您执行此操作的功能 - CryptDecodeObject
。
如果您有PCCERT_CONTEXT
句柄pCertContext
,则可以将其解码为CERT_NAME_INFO
结构,如下所示:
BOOL success = CryptDecodeObject(
X509_ASN_ENCODING,
X509_NAME,
pCertContext->pCertInfo->Issuer.pbData,
pCertContext->pCertInfo->Issuer.cbData,
0,
NULL,
&dwNameInfoSize);
// (check that CryptDecodeObject succeeded)
PCERT_NAME_INFO pCertNameInfo = (PCERT_NAME_INFO) malloc(dwNameInfoSize);
// (check that malloc succeeded)
CryptDecodeObject(
X509_ASN_ENCODING,
X509_NAME,
pCertContext->pCertInfo->Issuer.pbData,
pCertContext->pCertInfo->Issuer.cbData,
0,
pCertNameInfo,
&dwNameInfoSize);
现在,您可以像这样循环遍历RDN的不同组件:
for (DWORD i = 0; i < pCertNameInfo->cRDN; i++)
{
for (DWORD j = 0; j < pCertNameInfo->rgRDN[i].cRDNAttr; j++)
{
CERT_RDN_ATTR &rdnAttribute = pCertNameInfo->rgRDN[i].rgRDNAttr[j];
//
// Do stuff with the RDN attribute
//
}
}
每次迭代时,rdnAttribute
将被设置为发布者名称的不同组件。
最后,在你完成后释放记忆:
free(pCertNameInfo);