我正在尝试验证来自签名链的证书是否返回到Windows不信任的特定根证书(它是应用程序的私有证书)。
我目前这样做的尝试涉及创建一个链接引擎,它只信任我想要的特定证书作为根,因此不能生成其他链。
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(¶ms, 0, sizeof(params));
params.cbSize = sizeof(params);
PCCERT_CHAIN_CONTEXT chains = NULL;
if (CertGetCertificateChain(hEngine, pCertContext, NULL, hStore, ¶ms,
0, NULL, &chains))
...
(为清楚起见,省略了错误检查;pCertContext
并且hStore
来自从CryptQueryObject
签名的二进制文件中提取签名和相关证书。)
不幸的是,这似乎不起作用。尽管使用了自定义链接引擎,但它似乎仍在搜索 OS 存储,并且要么找不到链,要么找到一个到不同的根(操作系统信任)。我只能通过将我的私有根证书添加到操作系统受信任的存储中来获得我想要的链。
我也尝试设置config.hRestrictedOther
为空的内存存储,因为文档建议使用hRestrictedTrust
非 NULL 将再次引入系统存储,但这没有任何区别。
有什么我错过的,或者更好的方法吗?
编辑:只是为了提供更多上下文,我正在尝试做一些类似于驱动程序签名证书的事情,其中签名证书链回两个不同的根:一个受操作系统信任的标准 CA 根和一个内部根(在驱动程序也受操作系统信任,但在我的情况下,只会受我的应用程序信任)。十字架出现在“主”链的中间位置;可能有许多不同的文件都使用不同的“真实”CA 签名,但仍链接回我的内部证书。