gpt4 book ai didi

c++ - 将证书链获取到私有(private)根

转载 作者:太空狗 更新时间:2023-10-29 21:49:53 25 4
gpt4 key购买 nike

我正在尝试验证来自签名的证书链回到特定的根证书,Windows 信任它(它是应用程序的私有(private)证书)。

我目前的尝试是创建一个链引擎,它只信任我想要的特定证书作为根证书,这样就不会生成其他链。

HCERTSTORE hPrivateRootStore = CertOpenStore(CERT_STORE_PROV_FILENAME, dwEncoding,
NULL, CERT_STORE_OPEN_EXISTING_FLAG | CERT_STORE_READONLY_FLAG,
_T("C:\\Test\\PrivateRoot.cer"));
CERT_CHAIN_ENGINE_CONFIG config;
memset(&config, 0, sizeof(config));
config.cbSize = sizeof(config);
config.hRestrictedTrust = hPrivateRootStore;
config.dwFlags = CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL | CERT_CHAIN_ENABLE_SHARE_STORE;
HCERTCHAINENGINE hEngine;
CertCreateCertificateChainEngine(&config, &hEngine);
CERT_CHAIN_PARA params;
memset(&params, 0, sizeof(params));
params.cbSize = sizeof(params);
PCCERT_CHAIN_CONTEXT chains = NULL;
if (CertGetCertificateChain(hEngine, pCertContext, NULL, hStore, &params,
0, NULL, &chains))
...

(为清楚起见,省略了错误检查;pCertContexthStore 来自 CryptQueryObject,从已签名的二进制文件中提取签名和相关证书。)

不幸的是,这似乎行不通;尽管使用自定义链接引擎,它似乎仍在搜索操作系统商店,并且要么没有找到链,要么找到一个不同的根(操作系统信任)。我只能通过将我的私有(private)根证书添加到 OS 可信存储来获得我想要的链。

我还尝试将 config.hRestrictedOther 设置为一个空的内存存储,因为文档建议让 hRestrictedTrust 非 NULL 将再次引入系统存储,但这没有任何区别。

有没有我遗漏的东西,或者更好的方法?

编辑:只是为了提供更多上下文,我正在尝试做一些类似于驱动程序签名证书的事情,其中​​签名证书链回到两个不同的根:一个标准的 CA 根信任由操作系统和一个内部根(在驱动程序中也受操作系统信任,但在我的情况下只会受我的应用程序信任)。交叉发生在“主”链的中间某处;可能有许多不同的文件都使用不同的“真实”CA 签名,但仍链接回我的内部证书。

最佳答案

我现在找到了一个半生不熟的解决方法;它有点难看,但确实有用。我从 Chromium's test suite 得到了基本的想法;它涉及在 Crypt32 中安装一个 Hook ,这样当它尝试打开系统存储以构建链时,它会获取我的自定义存储,其中仅包含我想要的证书。

好处是,这似乎强制 CertGetCertificateChain“通过”真正的 CA 证书并一直链接到我的自定义证书,而不是在 CA 证书处停止(这是它通常在受信任时所做的)。

坏处是它似乎无法阻止它建立链并信任任何其他 CA 证书。我可以通过显式验证链的根是我想要的证书来解决这个问题,但这不太理想,而且我不确定是否存在会导致它出错的情况。

仍在寻找更好的解决方案;我肯定觉得我在某处走错了路。

好的,新计划。我现在只是手动走链(因为我知道我关心的所有证书都在从签名的 .exe 中提取的 hStore 中),基本结构如下:

  • 使用 WinVerifyTrust 进行基本的“是否未被篡改”的身份验证。
  • 使用 CryptQueryObject 从 .exe 中获取证书库 hStore
  • 使用 CryptMsgGetParamCertFindCertificateInStorehStore 中查找签名证书。
  • 从签名证书开始,使用 CertFindCertificateInStoreCERT_FIND_SUBJECT_NAME 循环查找潜在的颁发者证书;继续往回走,直到我找到自签名证书或找到我想要的根(通过 CertComparePublicKeyInfo 检查匹配项)。
  • 如果 CertVerifySubjectCertificateContext 表示签名不匹配,则放弃特定分支。

看起来比我之前尝试的方法更清晰。想法/评论/替代方案?

(在某些方面似乎更有意义的是添加一个额外的自定义副署[类似于时间戳]而不是像这样尝试链接证书,但我找不到任何关于这样做的信息,或者优点/缺点是什么。)

关于c++ - 将证书链获取到私有(private)根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7551942/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com