首页 > 解决方案 > 如何将私钥添加到 C++ 中 Windows 信任库中的证书?

问题描述

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

如果我运行这个命令

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 年的其他问题、程序示例和留言板,但没有一个是非常明确的,而且没有一个代码示例完全符合我的需要,但我知道我拥有所有的部分,他们只是没有t 产生结果。

标签: certificatex509certificateprivate-key

解决方案


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

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


推荐阅读