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

问题描述 投票:0回答:1

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

如果我运行此命令

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工具验证这一点,该工具显示是否附加了私钥,当我在我正在制作的卷曲请求中使用该客户端证书时,我也看到它不起作用。

我尝试的另一件事是:

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

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

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

我发现了一些可追溯到2002年的其他一些问题,程序示例和留言板,没有一个是非常明确的,没有一个代码示例完全符合我的要求,但我知道我有所有的部分,他们只是不要产生结果。

certificate x509certificate private-key
1个回答
0
投票

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

如果你有一个HCRYPTPROV句柄,那么你拥有构建CRYPT_KEY_PROV_INFO结构的所有必要信息。

© www.soinside.com 2019 - 2024. All rights reserved.