我想验证签名的可执行镜像的证书(通过验证,我的意思是判断签名是否来自 MS/Adobe/Oracle 等)。 Windows 是否为此任务提供 api?我该怎么做,不知道。任何帮助,将不胜感激。 我正在使用 Windows 和 C++。我想验证 native 可执行镜像,而不是 .NET 程序集或 Java jar 文件。
更新
好的,我会尽快描述我想要的。
1) 验证 PE 证书。签名是否有效。当签名嵌入到 PE 中并且签名在安全目录中时,它应该可以工作。 (我在 sysinternals 论坛上找到了这个并且工作正常,所以我不再需要这个)。
2) 告诉谁是文件的签名者/发布者。我知道它可以通过 CryptQueryObject 实现(我找到了一个工作示例,虽然它不适用于安全目录),但不知道如何将它与安全目录文件一起使用。
最佳答案
有许多 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);
值 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不仅要验证证书在一般情况下是有效的,而且它(或其所有父级)对于验证码( szOID_PKIX_KP_CODE_SIGNING )是有效的。 CertGetCertificateChain可用于不同的撤销场景。您应该使用 CERT_CHAIN_POLICY_AUTHENTICODE 进行两次单独的通话。和 CERT_CHAIN_POLICY_AUTHENTICODE_TS验证 Authenticode 链策略和 Authenticode 时间戳链策略是否有效。
已更新:我重读了您当前的问题(已更新部分)。您当前的问题是如何获取文件的签名者/发布者。所以我只回答这个问题。
如果您使用 the code from sysinternal对于签名验证,您应该只搜索该行
if ( !CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0) )
语句 sill 设置 InfoStruct 的字段如果该文件是系统 Windows 文件,其签名已针对某些 .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 C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat 的 ("1.3.6.1.4.1.311.2.1.12") 属性(见函数 GetProgAndPublisherInfo )你就知道了
pwszProgramName: "Windows Express Security Catalogs"
pPublisherInfo: NULL
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE
pMoreInfo->pwszUrl "http://www.microsoft.com"
因此,该文件不包含任何特殊的发布者信息。如果您检查目录的签名者,您会发现:
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
所以你应该只使用 .cat 文件的签名者,因为没有其他 explorer.exe 的签名者。 .
关于c++ - 从可执行文件中读取和验证证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7241453/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta