2011-10-15 13 views
11

Nella mia applicazione C#/.NET devo di controllo se un dato eseguibile viene firmato digitalmente(preferibilmente senza Exception test.)Verificare se un determinato file eseguibile è firmato digitalmente e valido?

poi ho bisogno di verificare se il suo certificato è valido(sulla base degli certificati root installati) e se il contenuto dei file è valido per la firma.

Ci sono così tante classi nel BCL, non so da dove cominciare & cosa utilizzare, e tutto ciò che ho trovato finora non elimina la mia confusione ...

mi piacerebbe piacerebbe fare qualcosa di simile, senza P/Invoke se possibile:

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

Aggiunto chiarimento:

Il grosso problema che ho attualmente è che non trovo un modo per ottenere la firma di tale file in un modo semplice. Speriamo ancora che ci sia una soluzione fornita, gestita, BCL come sarei sorpreso se esattamente quella parte è mancante. (Per il certificato è possibile farlo solo con X509Certificate.CreateFromSignedFile, è possibile anche convalidare)
Preferirei non mischiare il 50% di lavoro eseguito con il codice P/Invoke o una libreria diversa.

Ho trovato una classe AuthenticodeSignatureInformation, nessuna informazione sull'utilizzo di quello per un determinato file eseguibile.

+0

Eventuali duplicati di http://stackoverflow.com/questions/7622732/c-how-to-detect-tampering-of- authenticode-signed-file – DeCaf

+0

Spero che questo non sia un duplicato di una domanda non risposta;) – ordag

+0

La domanda collegata a tre risposte da quello che posso vedere. (Nessuno di questi è stato accettato, ma questo non vuol dire che non siano rilevanti). Ce n'è un'altra simile a http: // StackOverflow.it/questions/301024/validate-authenticode-signature-on-exe-c-without-capicom ma tutto rimanda all'utilizzo di p/invoke essendo richiesto sfortunatamente. – DeCaf

risposta

8

È possibile farlo utilizzando solo il codice gestito. Il progetto mono ha il proprio signcode e chktrust strumenti che consentono di firmare e verificare le firme Authenticode (tm).

Entrambi usano l'assembly Mono.Security.dll, che funziona bene sotto Windows, e tutto il codice è concesso in licenza con la licenza MIT.X11 (quindi puoi fare praticamente quello che vuoi con esso).

Tuttavia è necessario un po 'di logica aggiuntiva per controllare il certificato di root, dal momento che Mono utilizza i propri negozi - non quello su Windows. Questo non dovrebbe essere un grosso problema dal momento che .NET (dalla v2) fornisce classi che interrogano/accedono agli archivi di certificati utente/macchina.

Disclaimer:Ho scritto la maggior parte del codice di cui sopra ;-)

+0

Grazie, ho intenzione di esaminare che ... – ordag

+0

@poupou Non riesco a capire come ottenere qualsiasi cosa tranne la ragione 6 utilizzando Mono.Security.dll. Anche guardando il codice, dovrebbe ottenere il motivo 6 solo se si chiama IsTrusted() o se non c'era già un motivo per verificare la firma dopo aver impostato FileName. Il problema è che so che un file che sto testando ha una firma non valida, eppure in qualche modo passa tutto il primo set di controlli in CheckSignature() e finisce comunque con un errore di root attendibile. Si tratta di un bug nei controlli delle firme? – BrutalDev