如何从PCCERT_CONTEXT获取CSP的Provider名称?

发布于 2024-12-10 00:15:51 字数 299 浏览 1 评论 0原文

我一直在尝试从 PCCERT_CONTEXT 获取提供程序名称,因为在我当前的项目中,我必须将智能卡中的所有证书加载到我的程序中。将来我必须通过更新证书、删除证书等任务来处理这些证书。但我有问题,我必须将 CSP 名称和提供程序名称与 CryptAcquireContext 映射到执行程序。我目前很困惑如何存档这个问题,任何人都可以提供一些指南来帮助我解决这个问题。 我尝试使用 dwPropId 的 CertGetCertificateContextProperty 为 CERT_KEY_PROV_INFO_PROP_ID,但我无法获取 CRYPT_KEY_PROV_INFO。

I have been try to get a provider name from PCCERT_CONTEXT because in my current project i must have load all certificate from smart card into my program. And in the future I have to deal with those certificate with some task like renewal certificate, delete certificate. But I have problem, I must to map CSP name and provider name with CryptAcquireContext to executive. And I currently confused how to archive this, can anyone have some guide to help me resolve this problem.
I have try CertGetCertificateContextProperty with dwPropId is CERT_KEY_PROV_INFO_PROP_ID but i can not get CRYPT_KEY_PROV_INFO.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岛徒 2024-12-17 00:15:51

如果我没理解错的话,下面的代码片段展示了如何从证书中提取密钥提供程序信息。

void trace(char* message, DWORD errorCode)
{
    cout << message << errorCode;
}

std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext)
{
    DWORD dwSize = 0;    
    BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                        CERT_KEY_PROV_INFO_PROP_ID,
                                                        NULL,
                                                        &dwSize);
    if (!bIsSuccess)
    {
        trace("CertGetCertificateContextProperty failed with error: ", GetLastError());
        return L"";
    }

    PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize);
    if (pKeyProvInfo == NULL)
    {
        trace("LocalAlloc failed with error:", GetLastError());
        return L"";
    }

    bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                   CERT_KEY_PROV_INFO_PROP_ID,
                                                   pKeyProvInfo,
                                                   &dwSize);

    std::wstring provName;
    if (bIsSuccess)
    {
        provName = pKeyProvInfo->pwszProvName;
    }

    LocalFree(pKeyProvInfo);

    return provName;
}

If I have understood you correctly, the following snippet shows how to extract the key provider information from a certificate.

void trace(char* message, DWORD errorCode)
{
    cout << message << errorCode;
}

std::wstring Test_CertGetCertificateContextProperty(PCCERT_CONTEXT pCertContext)
{
    DWORD dwSize = 0;    
    BOOL bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                        CERT_KEY_PROV_INFO_PROP_ID,
                                                        NULL,
                                                        &dwSize);
    if (!bIsSuccess)
    {
        trace("CertGetCertificateContextProperty failed with error: ", GetLastError());
        return L"";
    }

    PCRYPT_KEY_PROV_INFO pKeyProvInfo = (PCRYPT_KEY_PROV_INFO)LocalAlloc(LMEM_ZEROINIT, dwSize);
    if (pKeyProvInfo == NULL)
    {
        trace("LocalAlloc failed with error:", GetLastError());
        return L"";
    }

    bIsSuccess = CertGetCertificateContextProperty(pCertContext, 
                                                   CERT_KEY_PROV_INFO_PROP_ID,
                                                   pKeyProvInfo,
                                                   &dwSize);

    std::wstring provName;
    if (bIsSuccess)
    {
        provName = pKeyProvInfo->pwszProvName;
    }

    LocalFree(pKeyProvInfo);

    return provName;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文