我的问题是关于 CNG API 和 Microsoft 提供商的用例。我不编写代码示例,因为与 CSP API 相比,我请求您帮助了解在我的应用程序中使用 CNG API 的最佳方式。
我构建了一个应用程序,它使用通过以下步骤存储的对称密钥:
- 使用CertFindCertificateInStore枚举“我的”存储中的证书
- 对于找到的每个证书,使用CertGetCertificateContextProperty询问私钥信息
- 对于找到的每个私钥信息,存储提供程序名称pwszProvName和容器名称pwszContainerName
然后,当找到密钥时,我的应用程序使用使用 CSP API 找到的私钥执行签名功能:
- 使用带有pwszProvName和pwszContainerName的CryptAcquireContext初始化提供程序操作
- 使用 CSP 函数计算签名:CryptCreateHash、CryptHashData和CryptSignHash
使用 CSP 功能一切正常。
现在我尝试使用 CNG API 进行签名操作:
- 使用带有pwszProvName的NCryptOpenStorageProvider初始化提供程序操作
- 使用 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,默认提供程序只执行密钥存储管理。