是否有一種簡單的方法檢查文件上是否存在數字簽名而不嘗試驗證其簽名的證書?確定文件是否具有c#中的數字簽名而未真正驗證簽名
我想在一個目錄中籤名很長的exe文件列表& dll文件,但只有尚未簽名的文件。
例如,如果其中一個文件已經由Microsoft或其他第三方簽名,我不想用我公司的證書再簽名。
通過右鍵單擊文件並查看其屬性(如果數字簽名標籤出現,然後簽名),可以輕鬆檢查文件是否具有數字簽名。我正在尋找一種簡單的方法來檢查使用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」和檢查,如果輸出包含文本「簽名證書鏈」 - 僅僅是因爲我注意到那個字符串總是在已經簽名的文件的輸出中 - 並且從沒有簽名的文件中被省略。
無論如何,儘管它的笨拙,這段代碼似乎完成了工作。我想改變它的一個原因是因爲它似乎需要幾百毫秒才能在文件上執行verify命令。我不需要驗證證書,我只是試圖查看文件上是否存在數字簽名。
簡而言之,是否有一種簡單的方法來檢查數字簽名是否存在 - 而不是試圖驗證它?
p.s.您可能認爲擔心幾百毫秒會很挑剔,但是如果您正在檢查數千個文件,則會加起來。 – ksun 2013-04-11 01:00:06
速度慢的原因可能並不是因爲您正在驗證簽名,而是速度緩慢的原因是因爲您正在爲每個文件產生一個新的進程。獲取C#原生的數字簽名庫,例如Bouncy Castle。 – 2013-04-11 01:16:15