【发布时间】:2013-04-11 00:58:13
【问题描述】:
是否有一种简单的方法可以检查文件上是否存在数字签名,而无需尝试验证签名所用的证书?
我想在一个目录中签署一长串 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”并检查输出是否包含文本“签名证书链:”——因为我注意到该字符串始终在已签名文件的输出中- 并且在任何未签名的文件中被省略。
无论如何,尽管它很笨拙,但这段代码似乎可以完成工作。我想更改它的一个原因是因为它似乎需要几百毫秒才能对文件执行验证命令。我不需要验证证书,我只是想查看文件上是否存在数字签名。
简而言之,有没有一种简单的方法来检查数字签名是否存在 - 而无需尝试验证它?
【问题讨论】:
-
附注您可能认为担心几百毫秒是很挑剔的,但如果您要检查数千个文件,这会加起来。
-
它慢的原因可能不是因为您正在验证签名,它慢的原因是因为您正在为每个文件生成一个新进程。获取 C# 原生的数字签名库,例如 Bouncy Castle。
标签: c# digital-signature signing file-properties