c - Windows API 验证码获取根证书
问题描述
我想使用 Windows API 遍历经过身份验证的 PE 二进制文件的证书链。
为了获取证书存储,我遵循了 Microsoft 的示例:https:
//support.microsoft.com/en-us/help/323809/how-to-get-information-from-authenticode-signed-executables
有了它,我得到了叶证书和中间证书,但不是根证书。使用不同的 Windows 二进制文件(例如 explorer.exe)进行测试,
我尝试了以下循环来遍历商店:
while (pCertContext = CertFindCertificateInStore(hStore, ENCODING, 0, CERT_FIND_ANY, NULL, pCertContext));
while (pCertContext = CertEnumCertificatesInStore(hStore, pCertContext));
验证码签名中是否不包含根证书?
我错过了一些选择吗?
解决方案
感谢@RbMm 的建议CertGetCertificateChain
,这确实解决了我的问题。
要获得整个链,您需要从叶子证书开始(存储接缝以自上而下开始)。
CERT_INFO CertInfo;
CertInfo.Issuer = pSignerInfo->Issuer;
CertInfo.SerialNumber = pSignerInfo->SerialNumber;
pCertContext = CertFindCertificateInStore(hStore, ENCODING, 0, CERT_FIND_SUBJECT_CERT, (PVOID)&CertInfo, NULL);
if (!pCertContext) {
_tprintf(_T("CertFindCertificateInStore failed with %x\n"), GetLastError());
__leave;
}
CERT_ENHKEY_USAGE EnhkeyUsage;
CERT_USAGE_MATCH CertUsage;
CERT_CHAIN_PARA ChainPara;
EnhkeyUsage.cUsageIdentifier = 0;
EnhkeyUsage.rgpszUsageIdentifier = NULL;
CertUsage.dwType = USAGE_MATCH_TYPE_AND;
CertUsage.Usage = EnhkeyUsage;
ChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
ChainPara.RequestedUsage = CertUsage;
if (!CertGetCertificateChain(
NULL, // use the default chain engine
pCertContext, // pointer to the end certificate
NULL, // use the default time
NULL, // search no additional stores
&ChainPara, // use AND logic and enhanced key usage
// as indicated in the ChainPara
// data structure
dwFlags,
NULL, // currently reserved
&pChainContext)) {
cerr << "Error on CertGetCertificateChain" << endl;
__leave;
}
PCERT_SIMPLE_CHAIN rgpChain = NULL;
PCERT_CHAIN_ELEMENT rgpElement = NULL;
rgpChain = pChainContext->rgpChain[0];
for (int j = 0; j < rgpChain->cElement; j++) {
rgpElement = rgpChain->rgpElement[j];
PrintCertificateInfo(rgpElement->pCertContext);
cout << endl;
}
推荐阅读
- javascript - 在反应中将事件侦听器附加到 componentDidUpdate
- python - 带有套接字的 Python TypeError
- php - PHP注销脚本不起作用
- ios - 如何计算 Swift 中给定 AVURLAsset 中音频/字幕轨道的数量?
- git - Git Braching/Merging 策略:release + hotfix 分支,master 的意义何在
- python - Python / PyQt4 内存泄漏
- php - PHP 使用变量构建数组
- android - com.android.builder.dexing.DexArchiveBuilderException
- rust - 为什么这个值的寿命不够长?
- c# - UWP - 获取 Gridview 的第一个孩子