Есть ли простой способ проверить, существует ли цифровая подпись в файле, не пытаясь проверить сертификат, которым он был подписан?
Я хочу подписать длинный список файлов exe и dll в каталоге, но только файлы, которые еще не были подписаны.
Например, если один из файлов был подписан Microsoft или какой-либо другой третьей стороной, я не хочу снова подписывать их сертификатом моей компании.
Легко проверить, имеет ли файл цифровую подпись или нет, щелкнув файл правой кнопкой мыши и просмотрев его свойства (если отображается вкладка цифровой подписи, значит, он был подписан). Я ищу простой способ проверить это свойство цифровой подписи с помощью С#.
Прямо сейчас я использую команду verify с 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» и проверяю, содержит ли вывод текст «Цепочка сертификатов подписи:» — просто потому, что я заметил, что эта строка всегда была в выводе файла, который был подписан — и был исключен из любого файла, который не был подписан.
В любом случае, несмотря на свою неуклюжесть, этот код, кажется, выполняет свою работу. Одна из причин, по которой я хотел бы изменить его, заключается в том, что для выполнения команды проверки файла требуется несколько сотен миллисекунд. Мне не нужно проверять сертификат, я просто пытаюсь проверить, существует ли в файле цифровая подпись.
Короче говоря, есть ли простой способ проверить, существует ли цифровая подпись, не пытаясь ее проверить?