Dav*_*ita 15 c++ windows validation executable certificate
我想验证已签名的可执行映像的证书(通过验证,我的意思是告诉签名是否来自MS/Adobe/Oracle等).Windows是否为此任务提供api?我该怎么办,不知道.任何帮助,将不胜感激.我正在使用Windows和C++.我想验证本机可执行映像,而不是.NET程序集或Java jar文件.
UPDATE
好的,我会尽快描述我想要的东西.
1)验证PE证书.签名是否有效.当签名嵌入在PE中并且签名位于安全目录中时,它应该工作.(我在sysinternals论坛上发现这个并且运行正常,所以我不再需要这个了).
2)告诉谁是文件的签名者/出版者.我知道它可以通过CryptQueryObject实现(我找到了一个工作示例,虽然它不能与安全目录一起使用),但不知道如何将它与安全目录文件一起使用.
Ole*_*leg 23
有许多API和方法可以获取和验证可执行文件的签名以及如何获取所需的其他附加信息.问题是你选择哪个级别(高级别WinVerifyTrust)
可用于从CAT或EXE文件获取加密上下文的最简单的第一个API是CryptQueryObject函数.KB323809的代码示例可以帮助您了解如何解码所需信息.如果你使用CAT文件的主要区别是你应该修改CryptQueryObject的一些参数.我建议你只使用CERT_QUERY_CONTENT_FLAG_ALL和CERT_QUERY_FORMAT_FLAG_ALL和CryptQueryObject会做你需要内部的所有东西:
BOOL bIsSuccess;
DWORD dwEncoding, dwContentType, dwFormatType;
HCERTSTORE hStore = NULL;
HCRYPTMSG hMsg = NULL;
PVOID pvContext = NULL;
// fill szFileName
...
// Get message handle and store handle from the signed file.
bIsSuccess = CryptQueryObject (CERT_QUERY_OBJECT_FILE,
szFileName,
CERT_QUERY_CONTENT_FLAG_ALL,
CERT_QUERY_FORMAT_FLAG_ALL,
0,
&dwEncoding,
&dwContentType,
&dwFormatType,
&hStore,
&hMsg,
&pvContext);
Run Code Online (Sandbox Code Playgroud)
将由您dwContentType设置的值为CryptQueryObject您提供有关文件类型的基本信息szFileName.该pvContext会PCCERT_CONTEXT在您需要的大多数情况下,但它可以也PCCRL_CONTEXT或者PCCTL_CONTEXT,如果你使用.CTL或文件的.crl作为输入.您将收到hStore填写文件中的所有证书szFileName.所以关于pvContext和hStore你可以检查包含CryptoAPI的文件.如果你更喜欢低级别的API按摩,你可以使用hMsg,这将在一定情况下还设置dwContentType(至少为CERT_QUERY_CONTENT_PKCS7_SIGNED,CERT_QUERY_CONTENT_PKCS7_UNSIGNED,CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED).
要验证文件的签名,我建议您使用CertGetCertificateChain和CertVerifyCertificateChainPolicy来验证证书通常是有效的,但它(或其所有父节点)对authenticode(szOID_PKIX_KP_CODE_SIGNING)有效.CertGetCertificateChain可用于不同的撤销方案.您应该使用CERT_CHAIN_POLICY_AUTHENTICODE和执行两次单独的调用,CERT_CHAIN_POLICY_AUTHENTICODE_TS以验证Authenticode链策略和Authenticode时间戳链策略是否有效.
更新:我重读了您当前的问题(更新的部分).您当前的问题是如何获取文件的签名者/发布者.所以我只回答这个问题.
如果您使用sysinternal中的代码进行签名验证,则应该只搜索该行
if ( !CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0) )
Run Code Online (Sandbox Code Playgroud)
语句sill设置字段,InfoStruct以防该文件是系统窗口文件,哪个签名是针对某些.cat文件进行验证的.InfoStruct.wszCatalogFile字段将为您提供.cat文件的名称.
例如,在我的Windows 7上,如果我尝试验证C:\Windows\explorer.exe文件的数字签名,则可以找到其哈希的.cat C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat.
如果您使用KB323809中的代码,如上所述参数,CryptQueryObject您将解码(参见函数)的SPC_SP_OPUS_INFO_OBJID("1.3.6.1.4.1.311.2.1.12")属性,您将知道C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.catGetProgAndPublisherInfo
pwszProgramName: "Windows Express Security Catalogs"
pPublisherInfo: NULL
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE
pMoreInfo->pwszUrl "http://www.microsoft.com"
Run Code Online (Sandbox Code Playgroud)
因此,该文件不包含特殊的发布者信息.如果您检查目录的签名者,您会发现:
The signer of the .cat file: "Microsoft Windows"
The signer signed it with the certificate:
Serial Number: 0x6115230F00000000000A
Issuer Name: Microsoft Windows Verification PCA
Full Issuer Name:
CN = Microsoft Windows Verification PCA
O = Microsoft Corporation
L = Redmond
S = Washington
C = US
Subject Name: Microsoft Windows
Full Subject Name:
CN = Microsoft Windows
OU = MOPR
O = Microsoft Corporation
L = Redmond
S = Washington
C = US
The Date of TimeStamp : 28.02.2011 21:16:36
TimeStamp Certificate:
Serial Number: 0x6103DCF600000000000C
Issuer Name: Microsoft Time-Stamp PCA
Subject Name: Microsoft Time-Stamp Service
Run Code Online (Sandbox Code Playgroud)
所以你应该只使用.cat文件的签名者,因为没有其他的签名者explorer.exe.
小智 5
该的WinVerifyTrust函数执行指定对象的信任验证操作。该功能将查询传递给支持操作标识符(如果存在)的信任提供程序。
对于证书验证,请使用CertGetCertificateChain和CertVerifyCertificateChainPolicy函数。