.net 在Windows应用程序上验证代码签名证书

m0rkklqb  于 2023-02-14  发布在  .NET
关注(0)|答案(2)|浏览(222)

我正尝试以编程方式验证this question from 2014中所述的代码签名证书。在遵循这些建议后,我仍然无法找到一致的工作解决方案来确定我的.exe何时被篡改(即哈希不再匹配)
wintrust.dll中的WinVerifyTrust方法是最准确的,但是在我的可执行文件被混淆/虚拟化后,我似乎得到了一个误报。在这种情况下,我得到的结果是(int)2148204800,即使.exe经过有效签名且未被篡改。我也反对使用Windows API调用,因为我希望代码尽可能具有可移植性。
当然,其他方法(如X509Certificate.CreateFromSignedFile().Verify()和Powershell方法)不会验证exe的散列,因此返回true。
在过去的4年里,有没有新的方法来验证.exe的哈希值,最好是在纯.NET中?我很高兴有一个解决方案,它只验证哈希值,而不是整个证书(如果可能的话)。

vwoqyblh

vwoqyblh1#

如果你从Mono.Security中提取一个Nuget包,那么它有一个很好的AuthenticodeDeformatter类,可以验证代码签名证书:

var authenticode = new AuthenticodeDeformatter(Filename);
authenticode.IsTrusted(); //Should return False if tampered with.
xqkwcwgp

xqkwcwgp2#

您可以使用WinVerifyTrust API。
PInvoke.net: WinVerifyTrust提供了一个较大的工作类,其中的PInvoke调用太长,无法在此发布。您可以逐字复制该代码,然后调用WinTrust.VerifyEmbeddedSignature()来验证签名和文件哈希。
此外,检查证书(首先)以确保它是正确的证书也是一个好主意。有人可能会更改文件,然后使用新证书签名。
把它放在一起:

  • 检查证书
  • 使用WinTrust帮助程序
var theSigner = X509Certificate.CreateFromSignedFile(filePath);
var theCertificate = new X509Certificate2(theSigner);

// ensure it's my application's cerfificate
var subject = theCertificate.Subject;
if (!subject.Contains("ACME Inc.")
    return false;

// verify the authenticode signature and file hash
if (WinTrust.VerifyEmbeddedSignature(filePath))
    return true;

return false;

相关问题