Retrasar la firma de un ensamblado

Una organización puede tener un par de claves muy bien guardado al que los programadores no tiene acceso todos los días. La clave pública está disponible con frecuencia, pero la clave privada está restringida sólo a algunas personas. Al programar ensamblados con nombre seguro, cada ensamblado que hace referencia al ensamblado con nombre seguro de destino contiene el símbolo de la clave pública que se usa para dar al ensamblado de destino un nombre seguro. Ello requiere que la clave pública esté disponible durante el proceso de programación.

Se puede usar el retraso de firma o firma parcial en tiempo de compilación para reservar espacio en el archivo ejecutable portable (PE) para la firma de nombre seguro, pero la firma en sí se retrasa hasta más adelante, normalmente justo antes del envío del ensamblado.

Los pasos siguientes describen el proceso de retraso de la firma de un ensamblado:

  1. Obtenga la parte de clave pública del par de claves de la organización que, en su momento, llevará a cabo la firma. Normalmente, esta clave es un archivo .snk, que se puede crear con la herramienta Nombre seguro (Sn.exe) que proporciona Kit de desarrollo de software de Windows (SDK).

  2. Agregue al código fuente del ensamblado dos atributos personalizados de System.Reflection:

    • AssemblyKeyFileAttribute, que pasa el nombre del archivo que contiene la clave pública como parámetro a su constructor.

    • AssemblyDelaySignAttribute, que indica que se va a utilizar el retraso de firma pasando true como parámetro a su constructor. Por ejemplo:

      <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
      <Assembly:AssemblyDelaySignAttribute(True)>
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")]
      [assembly:AssemblyDelaySignAttribute(true)]
      
      [assembly:AssemblyKeyFileAttribute("myKey.snk")];
      [assembly:AssemblyDelaySignAttribute(true)];
      
  3. El compilador inserta la clave pública en el manifiesto del ensamblado y reserva espacio en el archivo PE para la firma de nombre seguro completa. La clave pública auténtica se debe guardar mientras se compila el ensamblado para que otros ensamblados que hagan referencia a éste puedan obtenerla y guardarla en su propia referencia al ensamblado.

  4. Como el ensamblado no tiene una firma de nombre seguro válida, hay que desactivar la comprobación de esa firma. Esto se hace utilizando la opción –Vr con la herramienta Nombre seguro.

    En el ejemplo siguiente se desactiva la comprobación para un ensamblado denominado myAssembly.dll.

    sn –Vr myAssembly.dll
    
    Nota de precauciónPrecaución

    Utilice la opción -Vr sólo durante la programación.Al agregar un ensamblado a la lista de omisiones de comprobación se produce una vulnerabilidad en la seguridad.Puede que un ensamblado malicioso utilice el nombre completo especificado (nombre de ensamblado, versión, referencia cultural y símbolo de clave pública) del ensamblado existente en la lista de omisiones de comprobación para imitar su identidad.Esto permitiría que el ensamblado malintencionado se pasase también por alto durante la comprobación.

    NotaNota

    Si utiliza la firma retardada durante desarrollo con Visual Studio en un equipo 64 bits, y compila un ensamblado para Cualquier CPU, podría tener que aplicar la opción -Vr dos veces.(En Visual Studio, Cualquier CPU es un valor de la propiedad de compilación Destino de la plataforma; al compilar desde la línea de comandos, es el valor predeterminado.) Para ejecutar la aplicación desde la línea de comandos o desde el Explorador de Windows, utilice la versión de 64 bits de Sn.exe (Herramienta de nombre seguro) para aplicar la opción -Vr al ensamblado.Para cargar el ensamblado en Visual Studio en tiempo de diseño (por ejemplo, si el ensamblado contiene componentes que utilizan otros ensamblados de la aplicación), utilice la versión de 32 bits de la herramienta de nombre seguro.Esto se debe a que el compilador Just-In-Time (JIT) compila el ensamblado a código nativo de 64 bits cuando el ensamblado se ejecuta desde la línea de comandos, y a código nativo de 32 bits cuando se carga en el entorno en tiempo de diseño.

  5. Posteriormente, por lo general justo antes del envío, el ensamblado se entrega a la autoridad de firma de la organización para que lleve a cabo la firma de nombre seguro propiamente dicha, utilizando la opción –R con la herramienta Nombre seguro.

    En el ejemplo siguiente se firma el ensamblado myAssembly.dll con un nombre seguro utilizando el par de claves sgKey.snk.

    sn -R myAssembly.dll sgKey.snk
    

Vea también

Tareas

Cómo: Crear un par de claves privada y pública

Referencia

Sn.exe (Herramienta de nombre seguro)

Conceptos

Crear ensamblados

Otros recursos

Programar con ensamblados