Czy istnieje prosty sposób sprawdzenia, czy podpis cyfrowy istnieje w pliku bez próby zweryfikowania certyfikatu, z którym został podpisany?Określanie, czy plik ma podpis cyfrowy w języku C# bez faktycznego weryfikowania podpisu
Chcę podpisać długą listę exe & plików dll w katalogu, ale tylko pliki, które nie zostały jeszcze podpisane.
Na przykład, jeśli jeden z plików został podpisany przez Microsoft lub inną firmę zewnętrzną, nie chcę podpisywać ich ponownie za pomocą certyfikatu mojej firmy.
Łatwo jest sprawdzić, czy plik ma podpis cyfrowy, czy też nie, klikając plik prawym przyciskiem myszy i wyświetlając jego właściwości (jeśli pojawi się karta podpisu cyfrowego, oznacza to, że została podpisana). Poszukuję prostego sposobu sprawdzenia tej właściwości podpisu cyfrowego przy użyciu C#.
W tej chwili używam polecenia verify z signtool.exe - które nie tylko sprawdza, czy podpis cyfrowy istnieje, ale także czy certyfikat użyty do podpisania pliku został wydany przez zaufany organ.
Oto mój prosty, ale przylegający podejście do w ten sposób:
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:");
}
Zauważ, że używam opisowy flagę „/ v” i sprawdzenie, czy wyjście zawiera tekst „łańcuch certyfikatu podpisu:” - tylko dlatego, że zauważyłem, że ten ciąg był zawsze na wyjściu pliku, który został podpisany - i został pominięty w każdym pliku, który nie został podpisany.
W każdym razie, pomimo niezgrabności, kod ten wydaje się wykonywać swoją pracę. Jednym z powodów, dla których chciałbym to zmienić, jest to, że wykonanie polecenia verify na pliku trwa kilkaset milisekund. Nie muszę weryfikować certyfikatu, który próbuję sprawdzić, czy w pliku istnieje podpis cyfrowy.
Krótko mówiąc, czy istnieje prosty sposób sprawdzenia, czy podpis cyfrowy istnieje - bez próby jego weryfikacji?
p.s. Możesz pomyśleć, że to jest wybredne, aby martwić się o kilkaset milisekund, ale to się sumuje, jeśli sprawdzasz tysiące plików. – ksun
Powód jest powolny, prawdopodobnie nie dlatego, że weryfikujesz podpis, powód jest powolny, ponieważ tworzysz nowy proces dla każdego pliku. Uzyskaj bibliotekę podpisów cyfrowych, która jest natywna dla języka C#, na przykład Bouncy Castle. –