【发布时间】:2015-01-23 15:26:35
【问题描述】:
我的问题是关于 CNG API 和 Microsoft 提供商的用例。我不编写代码示例是因为我寻求您的帮助,了解与 CSP API 相比,在我的应用程序中使用 CNG API 的最佳方式。
我构建了一个应用程序,它使用通过以下步骤存储的对称密钥:
- 使用 CertFindCertificateInStore 枚举“我的”存储中的证书
- 对于找到的每个证书,使用 CertGetCertificateContextProperty 询问私钥信息
- 对于找到的每个私钥信息,存储提供者名称 pwszProvName 和容器名称 pwszContainerName
然后,当找到密钥时,我的应用程序使用通过 CSP API 找到的私钥执行签名功能:
- 使用带有 pwszProvName 和 pwszContainerName 的 CryptAcquireContext 初始化提供程序操作
- 使用 CSP 函数计算签名:CryptCreateHash、CryptHashData 和 CryptSignHash
CSP 功能一切正常。
现在我尝试使用 CNG API 进行签名操作:
- 使用 NCryptOpenStorageProvider 和 pwszProvName 初始化提供程序操作
- 使用 CNG 函数 BCryptOpenAlgorithmProvider 的打开算法提供程序失败并显示 STATUS_NOT_FOUND
当私钥存储在 Microsoft Software Key Storage Provider 中时会发生此错误。 阅读 Microsoft 文档,我了解提供程序的类型是 KSP 提供程序,并且仅对密钥管理起作用。这就是为什么当我尝试原始函数时它失败的原因,我需要使用“原始提供者”。
我找到了按照这些设置使用 CNG 提供程序的方法:
- Windows Server 2008:创建具有提供程序要求的证书模板(在“加密”选项卡上)。唯一可用的提供商是“Microsoft Software Key Storage Provider
- Windows 7:用户要求生成密钥,密钥存储在 Microsoft KSP 中。
所以这是我的问题:
我无法使用“Microsoft Software Key Storage Provider”执行原始功能正常吗?
如果我无法使用 Microsoft KSP(它是 KSP 提供程序)执行原始功能(签名、加密、解密、散列),我如何使我的私钥在 Microsoft Primitive Provider 中存储和管理?
我的麻烦在于,使用 CSP API,默认的 Microsoft CSP 提供程序执行签名(以及解密、加密等)功能。但是使用 CNG API,默认提供程序只执行密钥存储管理。
【问题讨论】:
标签: c++ certificate key cng