如何在C ++中的Windows信任存储中为证书添加私钥?

时间:2018-09-19 00:14:27

标签: certificate x509certificate private-key

我有一个带有证书的文件,并且我有一个带有私钥文件的文件。

如果我运行此命令

certutil –MergePFX certfile.cer certfile.pfx

我得到一个pfx文件,如果使用资源管理器运行该文件,它将运行Windows证书导入向导。如果我通过向导运行,则最终得到带有Windows信任库中密钥的证书。正是我所需要的。

我正在尝试以编程方式执行此操作。

问题似乎出在CertAddCertificateContextToStore函数中。 在备注中说:

  

不使用CertDuplicateCertificateContext复制证书上下文。而是,函数创建上下文的新副本并将其添加到存储中。除了已编码的证书之外,CertDuplicateCertificateContext还复制上下文的属性,但CERT_KEY_PROV_HANDLE_PROP_ID和CERT_KEY_CONTEXT_PROP_ID属性除外。

因此certduplicatecertificatecontext非常不会复制私钥,而且CertAddCertificateContextToStore也不会复制私钥。

我有一个带有我的私钥的HCRYPTPROV结构,并且我使用CERT_KEY_CONTEXT_PROP_ID和CERT_KEY_PROV_HANDLE_PROP_ID(我都尝试了它们)到CertSetCertificateContextProperty我的证书上下文,然后使用CertAddCertificateContextToStore将其存储在Windows信任存储中。而且无论我尝试什么,证书都将不带私钥进入。

我正在使用certmgr工具进行验证,该工具显示是否附加了私钥,当我在正在执行的curl请求中使用该客户端证书时,我还可以看到它不起作用。

我尝试的另一件事是这样:

CertAddCertificateContextToStore的最后一个参数是所制作上下文的副本的句柄。我认为原始上下文是我创建的,我从磁盘读取证书。此新证书是与certmgr读取的实际磁盘存储相关的证书。

因此,在我调用CertAddCertificateContextToStore之后,我将获得新的证书,并再次通过CertSetCertificateContextProperty添加私钥,然后为了很好的评估,我调用CertControlStore将内存的上下文版本推送到磁盘。仍然没有效果。每个函数调用都会成功,但是私钥永远不会进入Windows信任库。

因此,简而言之,我的问题是Windows证书导入工具在做什么,我不是允许我将私钥和证书一起存储在Windows信任库中吗?

我发现了其他一些问题,程序示例和留言板,可追溯到2002年,没有一个非常明确,没有一个代码示例可以完全满足我的需要,但我知道我掌握了所有内容,它们只是不产生结果。

1 个答案:

答案 0 :(得分:0)

我坚信您设置的属性不正确。您应该仅在CERT_KEY_PROV_INFO_PROP_ID调用中设置CertSetCertificateContextProperty上下文属性,以将证书与私钥相关联。

如果您具有HCRYPTPROV句柄,则您具有构造CRYPT_KEY_PROV_INFO结构的所有必要信息。