certificate - 如何将私钥添加到 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 产生结果。
解决方案
我坚信您设置了不正确的属性。您应该CERT_KEY_PROV_INFO_PROP_ID
在调用中仅设置上下文属性以将CertSetCertificateContextProperty
证书与私钥相关联。
如果你有一个 HCRYPTPROV 句柄,那么你就有了构建CRYPT_KEY_PROV_INFO
结构的所有必要信息。
推荐阅读
- azure-data-explorer - 查询 Kusto 表时出现 CachedStorageObject 错误的解释
- java - Android工作室 - 谷歌地图:检查人是否在圈子里
- java - 从非声明位置的类访问 Java ThreadLocal 对象
- sql - 表中两列的所有组合
- azure - Azure Repos API 提交 - GetChanges 返回空列表
- javascript - 如何在 forEach 中获取索引?
- firebase - GatsbyJS with Firebase - WebpackError: ReferenceError: IDBIndex is not defined
- python - 如何在 Python 中使用字符串输入作为变量调用?
- javascript - 尝试在 JavaScript 中访问数组,结果未定义,不知道为什么
- javascript - 如何更改相对路径以指向服务器而不是本地主机?