2011-10-15 15 views
11

W mojej aplikacji C#/.NET muszę sprawdzenia, czy dany plik wykonywalny jest podpisany cyfrowo(najlepiej bez Exception testowania.)Sprawdź, czy dany plik wykonywalny jest podpisany cyfrowo i czy jest ważny?

Wtedy muszę czeku, jeśli jego certyfikat jest ważny(na podstawie zainstalowane certyfikaty główne) i , jeśli treść plików jest ważna dla podpisu.

Istnieje tak wiele klas w BCL, nie wiem od czego zacząć & co używać i nic znalazłem do tej pory nie eliminuje moje zamieszanie ...

ja jak zrobić coś takiego, bezP/Invoke jeśli to możliwe:

bool IsSignedFile(string path); 
Cert GetCertificateFromSignedFile(string path); 
bool IsValidCertificate(Cert cert) 
Sig GetSignatureFromSignedFile(string path); 
bool IsValidSignature(string path, Sig sig, Cert cert); 

Dodano wyjaśnienia:

Obecnie największym problemem jest to, że nie znajduję sposobu na łatwe uzyskanie podpisu takiego pliku. Nadal mam nadzieję, że istnieje dostarczone, zarządzane, BCL rozwiązanie, ponieważ byłbym zaskoczony, gdyby dokładnie tej części brakuje. (Dla certyfikatu można to zrobić tylko za pomocą X509Certificate.CreateFromSignedFile, sprawdzając także, czy jest to możliwe)
Wolałbym nie mieszać tej 50% pracy wykonanej z kodem P/Invoke lub dużej innej biblioteki.

Znalazłem klasę AuthenticodeSignatureInformation, brak informacji o tym, że dla danego pliku wykonywalnego.

+0

Możliwy duplikat http://stackoverflow.com/questions/7622732/c-how-to-detect-tampering-of- authentode-signed-file – DeCaf

+0

Mam nadzieję, że nie będzie to duplikat pytania, na które nie ma odpowiedzi;) – ordag

+0

Pytanie, z którym się wiąże, ma trzy odpowiedzi z tego, co widzę. (Żaden z nich nie został przyjęty, ale to nie znaczy, że nie są istotne). Jest inny podobny w http: // stackoverflow.com/questions/301024/validate-authentode-signature-on-exe-c-without-capicom, ale wszystko wskazuje na to, że korzystanie z p/invoke jest niestety wymagane. – DeCaf

Odpowiedz

8

Można to zrobić przy użyciu kodu tylko udało. Projekt mono posiada własne narzędzia, które umożliwiają podpisywanie i weryfikowanie podpisów Authenticode (tm).

Oba zespoły używają zestawu Mono.Security.dll, który działa poprawnie w systemie Windows, a cały kod jest licencjonowany na podstawie licencji MIT.X11 (dzięki czemu można prawie zrobić to, co chcesz z nim).

Do sprawdzenia certyfikatu głównego potrzebna jest jednak odrobina dodatkowej logiki, ponieważ Mono korzysta z własnych sklepów, a nie z systemu Windows. To nie powinno być dużym problemem, ponieważ .NET (od v2) udostępnia klasy, które wysyłają kwerendy/uzyskują dostęp do magazynów certyfikatów użytkownika/komputera.

Zastrzeżenie:pisałem większość kodu powyżej ;-)

+0

Dzięki, mam zamiar przyjrzeć się temu ... – ordag

+0

@poupou Nie mogę dowiedzieć się, jak uzyskać cokolwiek poza powodem 6 przy użyciu Mono.Security.dll. Nawet patrząc na kod, powinien on wywoływać tylko przyczynę 6, jeśli wywołasz IsTrusted() lub jeśli nie było już powodu, aby zweryfikować podpis po ustawieniu FileName. Problem polega na tym, wiem, że testowany przeze mnie plik ma nieprawidłowy podpis, a mimo to w jakiś sposób przechodzi on wszystkie pierwsze zestawy kontroli w CheckSignature() i kończy się tak czy inaczej zaufanym błędem root. Czy jest to błąd w sprawdzaniu podpisu? – BrutalDev

Powiązane problemy