从证书对象

时间:2016-01-07 08:08:19

标签: ssl certificate ssl-certificate

我正在使用“CertOpenStore”API打开证书存储区,并使用“CertEnumCertificatesInStore”API获取证书。 API返回的CERT_CONTEXT数据以CERT_NAME_BLOB类型提供颁发者名称。 如何从证书中获取CERT_RDN或CERT_NAME_INFO。 我的要求是获取颁发者名称属性(O,OU等)。我不想解析CertNameToStr API返回的字符串。

1 个答案:

答案 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);