4

我有一个以前生成的 RSA 私有签名密钥,它存储为PRIVATEKEYBLOB。我正在尝试将其移至新证书中,以便更好地管理密钥。如何获取此 blob 并将其转换为 .pfx 证书?

我有一个 HCRYPTPROV(使用 MS_ENHANCED_PROV 和 PROV_RSA_FULL)。我可以从 CryptImportKey 获得 HCRYPTKEY。

PFXExportCertStoreEx 似乎是将其导出到 PFX blob 的功能(我假设我会随后将其写入文件),但我不明白如何将密钥放入其中。

4

1 回答 1

2

如果我正确理解您的问题,则您将证书和相应的私钥作为数据 blob,并且两者都是分开的。如果您使用 CryptoAPI,请务必了解该 API 主要面向使用存储在证书存储中的证书和存储在密钥容器中的私钥。PFXExportCertStoreEx之类的功能遵循该方法,允许您将所有证书从一个证书存储导出到数据 blob,该数据 blob 可以保存为扩展名为 .PFX 的文件。

因此,您可以执行以下操作:

  1. 通过使用带有参数的CertOpenStore创建临时证书存储。CERT_STORE_PROV_MEMORY
  2. 使用CertAddEncodedCertificateToStore函数将证书 blob 放置到存储区。
  3. 使用带有选项的CryptAcquireContext创建新的密钥容器。CRYPT_NEWKEYSET您应该给容器一些唯一的名称(参见pszContainer函数的参数)。
  4. 关于CryptImportKey函数PRIVATEKEYBLOB,将您当前拥有的 中的信息导入到密钥容器中。
  5. 将证书存储中的证书绑定到密钥容器。为此,您应该使用CertSetCertificateContextProperty来设置证书的CERT_KEY_PROV_INFO_PROP_ID命名扩展属性。重要的是要理解扩展属性不是 X.509 规范的一部分。扩展属性允许您将与证书关联的一些附加信息存储在证书存储中(而不是证书本身)。如果CERT_KEY_PROV_INFO_PROP_ID您可以存储描述密钥容器的完整信息( CRYPT_KEY_PROV_INFO )。
  6. 现在可以使用PFXExportCertStoreEx将临时证书存储(仅保存一个证书并具有到密钥容器的链接)导出到内存 blob,然后将内存 blob 保存在 .PFX 文件中。
  7. 您应该删除在步骤 3 中创建的密钥容器。为此,您需要使用带有选项的CryptAcquireContext打开密钥容器。CRYPT_DELETEKEYSET
于 2012-09-14T08:49:12.887 回答