我有一个带有证书的文件,并且我有一个带有私钥文件的文件。
如果我运行此命令
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年,没有一个非常明确,没有一个代码示例可以完全满足我的需要,但我知道我掌握了所有内容,它们只是不产生结果。
答案 0 :(得分:0)
我坚信您设置的属性不正确。您应该仅在CERT_KEY_PROV_INFO_PROP_ID
调用中设置CertSetCertificateContextProperty
上下文属性,以将证书与私钥相关联。
如果您具有HCRYPTPROV句柄,则您具有构造CRYPT_KEY_PROV_INFO
结构的所有必要信息。