代码签名可执行文件两次简短问题如何从一个可执行文件(.EXE/.DLL)中获取有关多个代码签名证书的信息?预期答案最终接受的答案应该提出一种获取C#的所有证书的方法。概念/伪代码还可以,我不希望您编写完整的源代码。请参阅关于Security.StackExchange的此问题,以使用建议的工具获得中间答案。长问题我正在研究是否可以在插件(.DLL)上使用多个代码签名证书来检查它是否已经过正式测试。这是程序:似乎能够使用signtool/v/f/as第二次签署DLL文件,而不是我的代码的DLL文件,但这无关紧要。EXE已使用受信任的根证书和时间戳进行签名。第二个签名是使用我自己的证书创建的,遵循这些步骤,目前没有时间戳。在问这个问题之前我做了什么:到目前为止我发现的唯一相关问题是如何使用时间戳正确地双重签名,但没有答案。我最近实现了自己执行此操作的代码。我无法发布完整的解决方案,因为它嵌入在更大的静态分析工具中,但下面提供了使用WinVerifyTrust()Windows枚举文件路径中指定的Authenticode签名的工作简单C#控制台应用程序的代码。API功能在此知识库文章的帮助下。注意:仅Windows8和WindowsServer2012(或更高版本)支持枚举多个证书。早期版本的Windows只会报告零个或一个证书。此处提供的代码仅处理具有有效签名的文件和没有Authenticode签名的文件。它不能正确处理带有无效签名的文件。这留给读者作为练习。这是代码:usingSystem;使用System.Runtime.InteropServices;使用System.Security.Cryptography;使用System.Security.Cryptography.X509Certificates;namespaceReadAuthenticodeSignatures{内部静态类程序{内部静态voidMain(string[]args){stringfileName=args[0];IntPtrhWind=IntPtr.Zero;GuidWINTRUST_ACTION_GENERIC_VERIFY_V2=newGuid("{00AAC56B-CD44-11d0-8CC2-00C04FC295EE}");byte[]actionIdBytes=WINTRUST_ACTION_GENERIC_VERIFY_V2.ToByteArray();IntPtrpcwszFilePath=Marshal.StringToHGlobalAuto(fileName);尝试{WINTRUST_FILE_INFOFile=newWINTRUST_FILE_INFO(){cbStruct=Marshal.SizeOf(typeof(WINTRUST_FILE_INFO)),pcwszFilePath=pcwszFilePath,hFile=IntPtr.Zero,pgKnownSubject=IntPtr.Zero,};IntPtrptrFile=Marshal.AllocHGlobal(File.cbStruct);尝试{Marshal.StructureToPtr(File,ptrFile,false);WINTRUST_DATAWVTData=newWINTRUST_DATA(){cbStruct=Marshal.SizeOf(typeof(WINTRUST_DATA)),pPolicyCallbackData=IntPtr.Zero,pSIPClientData=IntPtr.Zero,dwUIChoice=WTD_UI_NONE,fdwRevocationChecks=WTD_REVOKE_NONE,dwUnionChoice=WTD_CHOICE_FILE,pFile=ptrFile,dwStateAction=WTD_STATEACTION_IGNORE,hWVTStateData=IntPtr.Zero,pwszURLReference=IntPtr.Zero,dwProvFlags=WTD_REVOCATION_CHECK_NONE,dwUIContext=WTD_UICONTEXT_EXECUTE,pSignatureSettings=IntPtr.Zero,};//仅Windows8和WindowsServer2012(及更高版本)支持使用此成员WINTRUST_SIGNATURE_SETTINGSsignatureSettings=default(WINTRUST_SIGNATURE_SETTINGS);boolcanUseSignatureSettings=Environment.OSVersion.Version>newVersion(6,2,0,0);IntPtrpSignatureSettings=IntPtr.Zero;if(canUseSignatureSettings){//设置WINTRUST_SIGNATURE_SETTINGS以获取文件中的签名数量signatureSettings=newWINTRUST_SIGNATURE_SETTINGS(){cbStruct=Marshal.SizeOf(typeof(WINTRUST_SIGNATURE_SETTINGS)),dwIndex=0,dwFlags=WSS_GET_SECONDARY_SIG_COUNT,cSecondarySigs=0,dwVerifiedSigIndex=0,pCryptoPolicy=IntPtr.Zero,};pSignatureSettings=Marshal.AllocHGlobal(signatureSettings.cbStruct);}try{if(pSignatureSettings!=IntPtr.Zero){Marshal.StructureToPtr(signatureSettings,pSignatureSettings,false);WVTData.pSignatureSettings=pSignatureSettings;}IntPtrpgActionID=Marshal.AllocHGlobal(actionIdBytes.Length);尝试{Marshal.Copy(actionIdBytes,0,pgActionID,actionIdBytes.Length);IntPtrpWVTData=Marshal.AllocHGlobal(WVTData.cbStruct);尝试{Marshal.StructureToPtr(WVTData,pWVTData,false);inthRESULT=WinVerifyTrust(hWind,pgActionID,pWVTData);if(hRESULT==0){if(pSignatureSettings!=IntPtr.Zero){//读回签名设置signatureSettings=(WINTRUST_SIGNATURE_SETTINGS)Marshal.PtrToStructure(pSignatureSettings,typeof(WINTRUST_SIGNATURE_SETTINGS));}intsignatureCount=signatureSettings.cSecondarySigs+1;Console.WriteLine("文件:{0}",f文件名);Console.WriteLine("Authenticodesignatures:{0}",signatureCount);控制台.WriteLine();对于(intdwIndex=0;dwIndex0){X509Certificate2证书=newX509Certificate2(cert.pCert);Console.WriteLine("签名证书指纹{0}:{1}",dwIndex+1,certificate.Thumbprint);}if(ProvSigner.sftVerifyAsOf.dwHighDateTime!=provData.sftSystemTime.dwHighDateTime&&ProvSigner.sftVerifyAsOf.dwLowDateTime!=provData.sftSystemTime.dwLowDateTime){日期时间戳=DateTime.FromFileTimeUtc(((long)ProvSigner.sftVerifyAsOf.dwLowDateTimesp1安装安装程序程序程序在windows8.1上上:文件:sqlserver2014sp1-kb3058865-x64-enu.exeauthentIcode签名:2个签名的签名1:sha1。sha1.sha1.sha1.sha1.sha1.ssha1.674b1756756756797nynyefandAlgorithm/04/201506:03:40签名2的哈希算法:sha256。签名2的证书指纹:76DAF3E30F95B244CA4D6107E0243BB97F7DF965签名2的时间戳:22/04/201506:03:51按enter退出。试试Mono它可以将所有文件的Authenticode证书拉到一行!使用Mono.Security.Authenticode;AuthenticodeDeformattermonoFileCert=newAuthenticodeDeformatter("System.Windows.dll");Console.WriteLine($"找到证书{monoFileCert.Certificates.Count}");https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Security.Authenticode/AuthenticodeDeformatter.cs使用示例:https://github.com/mono/mono/blob/主/mcs/工具/安全/chktrust。cs以上就是C#学习教程:CodeSigningExecutableFile分享两次的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请指正点击右侧联系管理员删除。如需转载请注明出处:
