viernes, 25 de octubre de 2013

Receta C# No. 1-9: Asignar un Nombre Seguro a un Assembly desde un Contenedor de Llaves

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En la receta anterior tuvimos la oportunidad de introducirnos en el mundo de los nombres seguros para nuestros assemblies: una característica de autenticación y versionamiento propia del .NET Framework. En esta ocasión vamos a crear un pequeño programa al que le vamos a especificar ciertos atributos para establecer el versionamiento y el nombre seguro a usar para nuestro assembly. Además, de presentar la forma de firmar postergada.

[Nota: Esta receta será mucho más corta que la anterior [1], debido a que estoy asumiendo que el lector ya tiene conocimiento acerca de los nombres seguros.]

1. Problema

Se posee una base de código existente, ahora se necesita que el código fuente C# de la solución quede firmado usando un nombre seguro desde un contenedor de llaves.

2. Solución

La utilidad sn.exe nos va a permitir firmar nuestros assemblies a partir de llaves generadas con esta misma herramienta. Se usará varios atributos para la versión, y el modo de firma postergado.

3. Discusión de la Solución

Vamos a crear una clase con una funcionalidad básica (para propósitos de demostración), agregaremos los siguientes atributos:
  • AssemblyVersion [3],
  • AssemblyKeyName [4]
Con AssemblyVersion especificamos la versión de nuestro assembly en el mismo archivo de código fuente C#. De forma análoga, también podemos especificar el nombre del archivo de llave o el proveedor de servicios de criptografía CSP [5][6].

En la implementación de la solución veremos que es posible utilizar otro atributo que nos hará más fácil el proceso de firmado de assemblies: AssemblyDelaySign [7]; la idea básica con este atributo es postponer la firma del atributo después de que el assembly haya sido compilado.

4. Práctica: Código C#

Empecemos por crear una clase muy sencilla.

Obsérvese el uso de los atributos mencionados en la sección de Discusión de Solución. Aquí especificamos la versión para nuestro assembly y el nombre del archivo que contiene el par de llave (CSP): MiLlave. El cuerpo del programa, Main, precisamente sólo consiste de una sentencia para la salida de texto estático: "Bienvenido al blog «OrtizOL Experiencias Construcción Software»".

Ahora procedamos con la creación del par de llave y su colocación en el contenedor CSP:




Creación de par de llaves y colocación en CSP
Figura 1. Creación de par de llaves y colocación en CSP.
[Nota: Recuerde que estos archivos deben ser colocados en el mismo directorio donde compilaremos nuestro assembly para su posterior firma.]

Pasamos a compilar el assembly (especificando la opción (o switch) de compilador) /keycontainer:



Verificamos el assembly:


Compilación y Verificación del Assembly.
Compilación y verificación del assembly.

Generación de firma postpuesta (Delay)

Como mencioné antes, el atributo AssemblyDelaySign [7] marcará la firma del assembly para un momento posterior. Así es su uso:

En el archivo de código fuente Programa.cs agregamos la siguiente línea de código:

[assembly:AssemblyDelaySign(true)]

Compilación:



Firma:



Esto es todo lo que tenemos que hacer para firmar nuestro assembly de forma postpuesta.

5. Conclusiones

Espero que a través de esta receta haya quedado claro el concepto de creación de nombres seguro (a pesar de que en la anterior se introdujo con más detalles tal concepto). Segimos el paso a paso de especificación de atributos para la versión de un assembly, como también el CSP que contiene las llaves.

6. Glosario

  • Cryptography Service Provider
  • Delay
  • Nombre Seguro
  • Strong Name

7. Enlaces & Literatura

[1]: R1-8 Cómo Crear y Gestionar Pares de Llaves para Ensamblados con Nombres Seguros | Experiencias Construcción Software - http://ortizol.blogspot.com/2013/10/r1-8-como-crear-y-gestionar-pares-de.html
[2]: Visual C# 2010 Recibes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[3]: AssemblyVersionAttribute Class (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assemblyversionattribute.aspx
[4]: AssemblyKeyNameAttribute Class (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assemblykeynameattribute.aspx
[5]: Cryptographic Service Provider - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Cryptographic_Service_Provider
[6]: Cryptographic Service Providers (Windows) - http://msdn.microsoft.com/en-us/library/windows/desktop/aa380245(v=vs.85).aspx
[7]: AssemblyDelaySignAttribute Class (System.Reflection) - http://msdn.microsoft.com/en-us/library/system.reflection.assemblydelaysignattribute.aspx


O

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.