2011-10-15 10 views
11

En mi solicitud C#/.NET tengo que verificación si un ejecutable dado está firmado digitalmente(preferiblemente sin Exception pruebas.)Verifica si un ejecutable dado tiene firma digital y es válido?

entonces necesito de verificación si el certificado es válido(basado en la certificados raíz instalados) y si el contenido de los archivos es válido para la firma.

Hay tantas clases en el BCL, no sé por dónde empezar & lo de usar, y todo lo que he encontrado hasta ahora no elimina mi confusión ...

que había gustaría hacer algo como esto, sin P/Invoke si es posible: la clarificación

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

Agregado:

El gran problema que tengo actualmente es que no encuentro una manera de obtener la firma de dicho archivo de una manera fácil. Todavía espero que haya una solución provista, administrada, BCL, ya que me sorprendería si esa parte falta exactamente. (Para el certificado esto se puede hacer con sólo X509Certificate.CreateFromSignedFile, validando que es posible, también)
prefiero no mezclar que el 50% trabajo hecho con P/Invoke código o una biblioteca de gran diferentes.

He encontrado una clase AuthenticodeSignatureInformation, sin embargo, no hay información sobre el uso de eso para un ejecutable dado.

+0

duplicado Posible de http://stackoverflow.com/questions/7622732/c-how-to-detect-tampering-of- authenticode-signed-file – DeCaf

+0

Espero que esto no sea un duplicado de una pregunta no respondida;) – ordag

+0

La pregunta relacionada con tiene tres respuestas de lo que puedo ver. (Ninguno de ellos fue aceptado, pero eso no quiere decir que no sean relevantes). Hay otro similar en http: // stackoverflow.com/questions/301024/validate-authenticode-signature-on-exe-c-without-capicom pero todo indica que el uso de p/invoke es obligatorio, por desgracia. – DeCaf

Respuesta

8

Puede hacerlo utilizando el código sólo logró. El proyecto mono tiene sus propias signcode y chktrust herramientas que le permiten firmar y verificar firmas Authenticode (tm).

Ambos usan el ensamblaje Mono.Security.dll, que funciona bien en Windows, y todo el código está licenciado bajo la licencia MIT.X11 (para que pueda hacer prácticamente lo que quiera con él).

Sin embargo, necesitará un poco de lógica adicional para verificar el certificado raíz, ya que Mono usa sus propias tiendas, no la de Windows. Eso no debería ser un gran problema ya que .NET (desde v2) proporciona clases que consultan/acceden a los almacenes de certificados de usuario/máquina.

responsabilidad:que escribió la mayor parte del código anterior ;-)

+0

Gracias, voy a investigar eso ... – ordag

+0

@poupou No se puede averiguar cómo obtener nada más que el motivo 6 usando Mono.Security.dll. Incluso al mirar el código, solo debería obtener el motivo 6 si llama a IsTrusted() o si ya no había un motivo para verificar la firma después de establecer FileName. El problema es que sé que un archivo que estoy probando tiene una firma no válida, pero de todos modos pasa el primer conjunto de comprobaciones en CheckSignature() y de todos modos termina con un error de raíz de confianza. ¿Es esto un error en los controles de firma? – BrutalDev

Cuestiones relacionadas