有没有一种简单的方法可以检查文件上是否存在数字签名,而无需尝试验证其签名的证书?
我想在一个目录中签署一长串 exe 和 dll 文件,但只签署尚未签署的文件。
例如,如果其中一个文件已由 Microsoft 或其他第 3 方签名,我不想用我公司的证书再次对其进行签名。
通过右键单击文件并查看其属性(如果显示数字签名选项卡,则表明它已被签名),可以轻松检查文件是否具有数字签名。我正在寻找一种使用 C# 检查此数字签名属性的简单方法。
现在,我正在使用带有 signtool.exe 的 verify 命令——它不仅检查数字签名是否存在,而且检查用于签署文件的证书是否由受信任的机构颁发。
这是我这样做的简单但笨拙的方法:
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”并检查输出是否包含文本“签名证书链:”——只是因为我注意到该字符串始终在已签名文件的输出中——并且是从任何未签名的文件中省略。
无论如何,尽管它很笨拙,但这段代码似乎可以完成工作。我想更改它的一个原因是因为它似乎需要几百毫秒才能对文件执行验证命令。我不需要验证我只是想查看文件上是否存在数字签名的证书。
简而言之,有没有一种简单的方法来检查数字签名是否存在 - 而无需尝试验证它?