CryptAcquireCertificatePrivateKey 无法检索CERT_SYSTEM_STORE_LOCAL_MACHINE下列出的证书的私钥

Roy Li - MSFT 33,371 信誉分 Microsoft 供应商
2024-07-26T05:39:14.22+00:00

我使用Below程序检索存储在LOCAL_MACHINE下的“1-ksp-digitalid-MSKSP 27th June”证书的私钥。它给了我错误0x80090016即键集不存在错误。在“属性”上,您可以看到对话框,上面写着“您有与此证书对应的私钥”

Property picture

//Open Local Machine store

    NCRYPT_KEY_HANDLE hKey = 0;

    PCCERT_CONTEXT pCertContext = NULL;

    HCERTSTORE hCertStore = NULL;

    DWORD dwKeySpec;

    BOOL bCallerFreeProv;

hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"My");

// Enumerate all certificates.

        while (pCertContext = CertFindCertificateInStore(hCertStore, X509_ASN_ENCODING, 0, CERT_FIND_ANY, NULL, pCertContext))

        {

            std::cout << "\n=====================================================================================================\n";

            // Print the certificate's subject name.

            wchar_t szName[256];

            if (CertGetNameString(pCertContext, CERT_NAME_SIMPLE_DISPLAY_TYPE, 0, NULL, szName, 256))

            {        

            }

            if (lstrcmpiW(szName, L"1-ksp-digitalid-MSKSP 27th June") != 0)

                continue;

            std::wcout << "Certificate Subject Name: " << szName << std::endl;

            // Get the private key

            if (!CryptAcquireCertificatePrivateKey(pCertContext, CRYPT_ACQUIRE_PREFER_NCRYPT_KEY_FLAG, NULL, &hKey, &dwKeySpec, &bCallerFreeProv))

            {

                LPVOID lpMsgBuf;

                LPVOID lpDisplayBuf;

                DWORD dw = GetLastError();

                FormatMessageW(

                    FORMAT_MESSAGE_ALLOCATE_BUFFER |

                    FORMAT_MESSAGE_FROM_SYSTEM |

                    FORMAT_MESSAGE_IGNORE_INSERTS,

                    NULL,

                    dw,

                    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),

                    (LPWSTR)&lpMsgBuf,

                    0, NULL);

                wprintf(L"Error acquiring private key for %s.  Error: %lu  %s\n", szName, dw, lpMsgBuf);

                //goto Cleanup;

            }

        }

此问题由: CryptAcquireCertificatePrivateKey fails to retrieve the private key for certificate listed under CERT_SYSTEM_STORE_LOCAL_MACHINE - Microsoft Q&A总结而来

Windows API - Win32
Windows API - Win32
一组适用于桌面和服务器应用程序的核心 Windows 应用程序编程接口 (API)。 以前称为 Win32 API。
105 个问题
0 个注释 无注释
{count} 票

1 个答案

排序依据: 非常有帮助
  1. Tong Xu - MSFT 2,471 信誉分 Microsoft 供应商
    2024-07-26T09:05:40.4666667+00:00

    你好, 欢迎来到 Microsoft Q&A!

    CryptAcquireCertificatePrivateKey 和 Certutil.exe 命令行程序报告相同的错误,即缺少存储的密钥集。这是关于您的证书的问题,该问题无法正确安装,或者是权限问题,但不是WindowsAPI问题。您可以参考有关丢失存储的密钥集的类似问题。希望 CertMgr 和这个问题有帮助。

    如果答案是正确的解决方案,请单击“接受答案”并请投赞成票。如果您对此答案有其他疑问,请点击“评论”。

    注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知

    0 个注释 无注释

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。