c# - una - no se puede cargar el archivo o ensamblado net standard
¿Cómo verificar mediante programación que un ensamblaje esté firmado con un Certificado específico? (4)
Aquí hay una publicación de blog con ejemplos de código sobre cómo verificar firmas de ensamblajes:
http://blogs.msdn.com/b/shawnfa/archive/2004/06/07/150378.aspx
El ejemplo de código al final muestra cómo verificar si un ensamblaje fue firmado por Microsoft o no, puede hacer lo mismo obteniendo el token de certificado para el certificado de su compañía.
Actualización: el usuario @Saber editó esto con la siguiente actualización, pero esa actualización fue rechazada por otros. Sin embargo, es un consejo muy válido, así que estoy reenviando su edición ya que SO no me deja aprobarlo:
Editar (gracias, OP): si desea hacer esto de manera más segura (es decir, hacer que su programa sea más a prueba de manipulaciones), haga referencia a un conjunto en su programa que tenga un nombre seguro con la clave correspondiente, luego use el token del conjunto al que se hace referencia para comparar con el token del conjunto llamante. Si utiliza matrices de bytes (según el enlace), simplemente puede editarse y cambiarse de forma hexadecimal.
Mi escenario es que tenemos un programa (exe) que iniciará otros programas si se encuentra en una carpeta en particular. Quiero asegurarme de que solo inicie programas firmados con nuestro certificado corporativo (aprobado por Verisign, etc.). Esencialmente, entonces solo iniciará los programas con el mismo certificado que el mismo. No quiero enviar el certificado en sí.
He estado buscando en la web y en el espacio de nombres del sistema y no he encontrado un ejemplo claro que lea los datos del certificado de un archivo y también los valide, y pueda verificarlos con otro archivo. Lo más cercano que he encontrado es Signtool y tener esta verificación en un exe separado es un poco menos importante. Sé que el nombre de Strong Naming no ayudará porque un archivo firmado digitalmente es diferente, tal como se explica aquí (http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly- dl-is-strong-named /) También algunos otros ejemplos en SO que muestran el cifrado y la verificación de datos sin procesar pero no un conjunto donde se empaquetan juntos de alguna manera.
¿Alguna idea o sugerencia?
Creo que hay una manera de usar un nombre fuerte con el propósito de "Confianza". Entiendo que Microsoft solo recomienda un nombre seguro para garantizar que los contenidos del ensamblaje no se hayan modificado y sugiero usar "Authenticode" para la confianza.
Pero si la aplicación del cargador (la aplicación que carga estos conjuntos / programas) mantiene una lista cifrada de "Conjuntos" que puede cargar; ¿No resolvería eso el problema de "Confianza"?
Por ejemplo, ¿el cargador de paquetes puede mantener el nombre del conjunto con claves públicas y cargar el conjunto / programa a través del nombre completo del conjunto?
<PackageHandlers>
<PackageHandler>
<Package type="Package1" assembyName="SomeAssembly" publickey="d45755dbb8b44e59" />
</PackageHandler>
</PackageHandlers>
Existen dos tecnologías de firma para los ensamblados .NET: strongnaming y Authenticode (el autenticodo se usa para firmar PE y algunos otros archivos, no solo los ensamblajes .NET). Se utilizan para diferentes propósitos. Los certificados se utilizan en Authenticode solo para autenticar al autor. Strongnaming no autentica al autor en absoluto.
Además de verificar la firma, el certificado debe validarse para garantizar que se haya emitido para un autor determinado. La validación adecuada es un procedimiento complejo que implica la verificación de CRL (lista de revocación de certificados) y OCSP (estado de certificado en línea).
Para realizar la verificación de la firma Authenticode, necesita el componente de verificación Authenticode. Una de las opciones es usar el paquete PKIBlackbox de nuestro producto SecureBlackbox. El paquete incluye la verificación de Authenticode, así como mecanismos completos de validación de certificados.
Tenga en cuenta que si no va a validar el certificado, no tiene ningún sentido verificar la firma, ya que uno puede crear un certificado autofirmado con el mismo Asunto, Número de serie, etc., y utilizarlo para firmar el ensamblaje falsificado.
Puedes probar tres opciones aquí.
1) El primero está usando la carga de ensamblaje como aquí:
Assembly myDll =
Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");
Puede imprimir el formato hexadecimal de la clave pública y el token de clave pública para un ensamblaje específico utilizando el siguiente comando de Nombre fuerte (Sn.exe):
sn -Tp <assembly>
Si tiene un archivo de clave pública, puede usar el siguiente comando (tenga en cuenta la diferencia en el caso en la opción de línea de comandos):
sn -tp <assembly>
2) Aquí se menciona el segundo. Y use p / Invoke para tal problema.
3) También existe una tercera forma, más ágil y más compleja para hacer esto. Esta es una política vinculante . Puede tenerlo en cuenta en el caso de que deba proporcionar actualizaciones para una aplicación que ya está implementada. Cuando sale una nueva versión de un componente compartido que puede beneficiar a su aplicación, un archivo de políticas de la aplicación le permitirá proporcionar estos beneficios sin volver a compilar o reemplazar las instalaciones existentes.
Puedes encontrar más sobre esta característica aquí:
http://msdn.microsoft.com/en-us/library/aa309359%28v=vs.71%29.aspx
http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html