certificate – 如何将HCRYPTKEY或PRIVATEKEYBLOB导出到PFX文件

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

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

PFXExportCertStoreEx似乎是将它导出到PFX blob的函数(我假设我会写入文件),但我不明白如何将密钥输入它.

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

所以你能做的是以下几点:

>使用带有CERT_STORE_PROV_MEMORY参数的用法CertOpenStore创建临时证书库.
>使用CertAddEncodedCertificateToStore功能将证书blob放置到商店.
>使用带有CRYPT_NEWKEYSET选项的CryptAcquireContext创建新的密钥容器.您应该为容器指定一些唯一的名称(请参阅函数的pszContainer参数).
>将您当前拥有的PRIVATEKEYBLOB中的信息导入到关于CryptImportKey功能的密钥容器中.
>将证书从证书存储区绑定到密钥容器.为此,您应该使用CertSetCertificateContextProperty来设置CERT_KEY_PROV_INFO_PROP_ID,它是证书的名称扩展属性.重要的是要理解扩展属性不是其中的一部分
X.509规范.扩展属性允许您在证书存储区中存储与证书关联的一些其他信息(而不是在证书本身中).在CERT_KEY_PROV_INFO_PROP_ID的情况下,您可以存储描述密钥容器的完整信息(CRYPT_KEY_PROV_INFO).
>现在可以使用PFXExportCertStoreEx将临时证书存储(仅包含一个证书并具有到密钥容器的链接)导出到内存blob,然后将内存blob保存在.PFX文件中.
>您应该删除在步骤3中创建的密钥容器.为此,您需要使用带有CRYPT_DELETEKEYSET选项的CryptAcquireContext打开密钥容器.

点赞