如何将私钥添加到 C++ 中 windows 信任库中的证书?
How can I add a private key to a certificate in the windows trust store in c++?
我有一个包含证书的文件,还有一个包含私钥文件的文件。
如果我运行这个命令
certutil –MergePFX certfile.cer certfile.pfx
我得到一个 pfx 文件,如果我 运行 使用资源管理器,它 运行 是 windows 证书导入向导。如果我 运行 通过向导,我最终会在 windows 信任库中获得带有密钥的证书。正是我需要的。
我正在尝试以编程方式执行此操作。
问题似乎出在 CertAddCertificateContextToStore 函数中。
在评论中说:
The certificate context is not duplicated using CertDuplicateCertificateContext. Instead, the function creates a new copy of the context and adds it to the store. In addition to the encoded certificate, CertDuplicateCertificateContext also copies the context's properties, with the exception of the CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_CONTEXT_PROP_ID properties.
所以 certduplicatecertificatecontext 非常明确地不会复制私钥,而且 CertAddCertificateContextToStore 似乎也不会。
我有一个 HCRYPTPROV 结构和我的私钥,我使用 CERT_KEY_CONTEXT_PROP_ID 和 CERT_KEY_PROV_HANDLE_PROP_ID (我都试过了)到 CertSetCertificateContextProperty 我的证书上下文,然后我将它存储在 windows 使用 CertAddCertificateContextToStore 信任存储。而且无论我尝试什么,证书都没有私钥。
我正在使用 certmgr 工具验证这一点,该工具显示是否附加了私钥,而且当我在我发出的 curl 请求中使用该客户端证书时,我也可以看到它不起作用。
我尝试的另一件事是:
CertAddCertificateContextToStore 的最后一个参数是生成的上下文副本的句柄。我认为原始上下文是我从磁盘读取证书时创建的上下文。这个新证书与 certmgr 读取的实际磁盘存储相关联。
因此,在我调用 CertAddCertificateContextToStore 之后,我获取了新证书并添加了私钥,再次通过 CertSetCertificateContextProperty,然后为了更好的措施,我调用 CertControlStore 将上下文的内存版本推送到磁盘。还是没有效果。每个函数调用都成功,但私钥永远不会进入 windows 信任库。
所以简而言之,我的问题是 windows 证书导入工具是做什么的,我不是,它允许我将私钥与证书一起存储在 windows 信任库中?
我发现了一些可追溯到 2002 年的其他问题和程序示例以及留言板,none 非常明确,并且 none 的代码示例完全符合我的需要,但我知道我有所有的部分,他们只是没有产生结果。
我坚信您设置的属性不正确。您应该在 CertSetCertificateContextProperty
调用中仅设置 CERT_KEY_PROV_INFO_PROP_ID
上下文 属性 以将证书与私钥相关联。
如果您有 HCRYPTPROV 句柄,那么您就拥有构建 CRYPT_KEY_PROV_INFO
结构所需的所有信息。
我有一个包含证书的文件,还有一个包含私钥文件的文件。
如果我运行这个命令
certutil –MergePFX certfile.cer certfile.pfx
我得到一个 pfx 文件,如果我 运行 使用资源管理器,它 运行 是 windows 证书导入向导。如果我 运行 通过向导,我最终会在 windows 信任库中获得带有密钥的证书。正是我需要的。
我正在尝试以编程方式执行此操作。
问题似乎出在 CertAddCertificateContextToStore 函数中。 在评论中说:
The certificate context is not duplicated using CertDuplicateCertificateContext. Instead, the function creates a new copy of the context and adds it to the store. In addition to the encoded certificate, CertDuplicateCertificateContext also copies the context's properties, with the exception of the CERT_KEY_PROV_HANDLE_PROP_ID and CERT_KEY_CONTEXT_PROP_ID properties.
所以 certduplicatecertificatecontext 非常明确地不会复制私钥,而且 CertAddCertificateContextToStore 似乎也不会。
我有一个 HCRYPTPROV 结构和我的私钥,我使用 CERT_KEY_CONTEXT_PROP_ID 和 CERT_KEY_PROV_HANDLE_PROP_ID (我都试过了)到 CertSetCertificateContextProperty 我的证书上下文,然后我将它存储在 windows 使用 CertAddCertificateContextToStore 信任存储。而且无论我尝试什么,证书都没有私钥。
我正在使用 certmgr 工具验证这一点,该工具显示是否附加了私钥,而且当我在我发出的 curl 请求中使用该客户端证书时,我也可以看到它不起作用。
我尝试的另一件事是:
CertAddCertificateContextToStore 的最后一个参数是生成的上下文副本的句柄。我认为原始上下文是我从磁盘读取证书时创建的上下文。这个新证书与 certmgr 读取的实际磁盘存储相关联。
因此,在我调用 CertAddCertificateContextToStore 之后,我获取了新证书并添加了私钥,再次通过 CertSetCertificateContextProperty,然后为了更好的措施,我调用 CertControlStore 将上下文的内存版本推送到磁盘。还是没有效果。每个函数调用都成功,但私钥永远不会进入 windows 信任库。
所以简而言之,我的问题是 windows 证书导入工具是做什么的,我不是,它允许我将私钥与证书一起存储在 windows 信任库中?
我发现了一些可追溯到 2002 年的其他问题和程序示例以及留言板,none 非常明确,并且 none 的代码示例完全符合我的需要,但我知道我有所有的部分,他们只是没有产生结果。
我坚信您设置的属性不正确。您应该在 CertSetCertificateContextProperty
调用中仅设置 CERT_KEY_PROV_INFO_PROP_ID
上下文 属性 以将证书与私钥相关联。
如果您有 HCRYPTPROV 句柄,那么您就拥有构建 CRYPT_KEY_PROV_INFO
结构所需的所有信息。