gpt4 book ai didi

c# - 在不实际验证签名的情况下确定文件是否在 C# 中具有数字签名

转载 作者:可可西里 更新时间:2023-11-01 09:02:05 25 4
gpt4 key购买 nike

有没有一种简单的方法可以检查文件上是否存在数字签名,而无需尝试验证签名所用的证书?

我想对目录中的一长串 exe 和 dll 文件进行签名,但仅限于尚未签名的文件。

例如,如果其中一个文件已由 Microsoft 或其他某个第 3 方签署,我不想使用我公司的证书再次签署它们。

通过右键单击文件并查看其属性可以很容易地检查文件是否具有数字签名(如果出现数字签名选项卡则表明它已被签名)。我正在寻找一种使用 C# 检查此数字签名属性的简单方法。

现在,我正在使用带有 signtool.exe 的验证命令 - 它不仅会检查数字签名是否存在,还会检查用于签署文件的证书是否由受信任的机构颁发。

这是我执行此操作的简单但笨拙的方法:

private static Boolean AlreadySigned(string file)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.FileName = "signTool.exe";
startInfo.Arguments = "verify /v " + file;
startInfo.UseShellExecute = false;

Process process = new Process();
process.StartInfo = startInfo;
process.EnableRaisingEvents = true;
process.Start();
process.WaitForExit();
string output = process.StandardOutput.ReadToEnd();

return output.Contains("Signing Certificate Chain:");
}

请注意,我正在使用详细标志“/v”并检查输出是否包含文本“Signing Certificate chain:”——只是因为我注意到该字符串始终出现在已签名文件的输出中- 并从任何未签名的文件中省略。

无论如何,尽管它很笨拙,但这段代码似乎可以完成工作。不过,我想更改它的一个原因是因为它似乎需要几百毫秒才能对文件执行验证命令。我不需要验证证书我只是想看看文件上是否存在数字签名。

简而言之,是否有一种简单的方法来检查数字签名是否存在 - 而无需尝试验证它?

最佳答案

我使用“Get-AuthenticodeSignature”powershell 命令想出了一个相当不错的解决方案。我找到了 this site这解释了如何在 c# 中使用 powershell 命令。这样我就不需要生成多个进程,而且速度非常快。

using System.Collections.ObjectModel;
using System.Management.Automation;
using System.Management.Automation.Runspaces;


private static Boolean alreadySigned(string file)
{
try
{
RunspaceConfiguration runspaceConfiguration = RunspaceConfiguration.Create();
Runspace runspace = RunspaceFactory.CreateRunspace(runspaceConfiguration);
runspace.Open();

Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript("Get-AuthenticodeSignature \"" + file + "\"");

Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
Signature signature = results[0].BaseObject as Signature;
return signature == null ? false : (signature.Status != SignatureStatus.NotSigned);
}
catch (Exception e)
{
throw new Exception("Error when trying to check if file is signed:" + file + " --> " + e.Message);
}
}

关于c# - 在不实际验证签名的情况下确定文件是否在 C# 中具有数字签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15939073/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com