miércoles, 23 de octubre de 2013

Receta C# No.1-8: Cómo Crear y Gestionar Pares de Llaves para Ensamblados con Nombres Seguros

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 y Literatura

0. Introducción

Esta receta va a ser muy interesante porque aprenderemos cómo firmar nuestros assemblies para demostrar nuestra autoría, y gestionar el versionamiento. Los nombres seguros (o inglés, strong name) hacen referencia a la identidad de un assembly. Esto nos va a permitir crear diferentes versiones de nuestras librerías y desplegarlas en le GAC (Goblal Assembly Cache). Manos a la obra.

1. Problema

En la actualidad el grupo de desarrollo entrega los assemblies para despliegue en los servidores de producción de la compañía donde laboran, pero ha emergido un nuevo requerimiento funcional por parate del departamento de TI en donde se explícita el uso de firmas sobre cada iteración de despliegue que se lleve a cabo. Básicamente, se está exigiendo el uso de criptografía asimétrica [8], es decir, el uso de una llave pública y privada para la firma de los assemblies de despliegue, e inclusive, la asignación de nombres seguros a las unidades lógicas mencionadas.

2. Solución

El arquitecto de la solución ha optado por implementar el uso definitivo de nombres seguros para la creación de pares de llaves pública y privada.

3. Discusión

La plataforma .NET desde sus primeras versiones provee el mecanismo de generación de nombres seguros que no son más que cadenas que identifican a un assembly en el GAC, de tal manera que el colapso de nombres y versiones de assemblies quede remediado asignando una llave pública que le identifique en el repositorio.

La utilidad asociada a este mecanismo de firmado de assemblies se conoce como sn.exe [2] (Strong Name Tool). Nos permite administrar llaves, generar, y verificar firmas. Está disponible en la consola de desarrollador de Visual Studio.


Esta utilidad la encontramos en el menú Inicio -> Todos los Programas -> Visual Studio Tools.
Ejecución de la Developer Command Prompt for VS2012
Figura 1. Developer Command Prompt for VS2012.
[Nota: También podemos hacer que la utilidad sn.exe esté disponible en la consola estándar y en PowerShell [9] agregando una variable de entorno que apunte al directorio donde se encuentra instalada (en el momento de escribir esta receta la ruta que agregué corresponde con C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools).]

El uso básico de la utilidad sn.exe es como sigue:

sn [-quiet][option [parameter(s)]]

En particular:

sn -k MiLibreria.snk

Con el comando previo hemos creado la llave privada y pública.

GAC

El Caché de Ensamblados Global (o en inglés, Global Assembly Cache) es el respositorio de assemblies de alcance de máquina, es decir, de disponibilidad para todas las aplicaciones que requieren acceso a recursos (librerías) comunes.

En Wikipedia [3] está definido así:
The Global Assembly Cache (GAC) is machine-wide CLI assembly cache for the Common Language Infrastructure (CLI). The approach of having a specially controlled central repository addresses the flaws in the shared library concept and helps to avoid pitfalls of other solutions that led to drawbacks like DLL hell.
De aquí se puede inferir que además de servir como repositorio, el GAC provee el soporte necesario para evitar la colisión o dependencia de librerías [4] (esto se logra a través de nombres seguros, y que será ampliado con detalle cuando entremos en la parte de implementación de esta receta).

Global Assembly Cache Tool

La utilidad Gacutil.exe [5] es la que nos permita gestionar el despliegue, eliminación, o visualización de los assemblies en el GAC. También está disponible desde la consola de desarrollador de Visual Studio, en el Kit de Desarrollo de Microsoft Windows [6]. Veremos ejemplos de uso en el desarrollo de la solución que viene a continuación.

4. Práctica: Código C#

Vamos a crear una librearía a partir de la siguiente clase de utilidades aritmética.

La clase estática Aritmetica es sencilla (para propósitos de demostración de las utilidades que viene enseguida), posee métodos para operaciones artiméticas básicas.

4.1 Creación de la llave pública y privada

Para la creación de la llave pública para nuestro assembly utilizamos la siguiente lista de comandos:


En pantalla tendremos algo similar a los resultados que se muestran en la Figura 2:
Creación de pares de llaves a través de sn.exe
Figura 2. Creación de llaves pública y privada con sn.exe.

Podemos ver la llave pública con el siguiente comando:



En el prompt se genera un resultado como el que se visualiza en la
Figura 3:
Visualización de la llave pública.
Figura 3. Visualización de la llave pública.
El comando resaltada en amarillo es el que nos generará los dos siguientes resultados:
  • La llave pública usando el algoritmo SHA-1 [7], y
  • El token de llave pública: 8621c8261fa91dfa.
[Nota: A diferencia de la llave pública generada, el token corresponde con los últimos 8 bytes del código generado por el algoritmo SHA-1. Esto es con propósitos de hacer más compacto la referenciación a los assemblies.]

Ahora ha llegado el momento de desplegar nuestro assembly en el repositorio común GAC. Lo que tenemos que hacer desde la línea de comandos es lo siguiente:

1. Compilación y asociación de la llave MatematicaKey.snk:


2. Instalación del assembly Matematica.dll en el GAC:



En el prompt mostrará:
Mensaje satisfactorio de instalación de assembly.
Figura 4. Instalación satisfactoria de assembly en GAC.

Para validar que la instalación se ha realizada correctamente nos dirigiamos al directorio C:\Windows\Microsoft.NET\assembly\GAC_MSIL y comprabamos la existencia del assembly:
Vista del assembly recién instalado.
Figura 5. Vista del assembly recién instalado.

5. Conclusiones

Hemos explorado el uso de herramientas de .NET que nos permite firmar nuestros assemblies y así demostrar la autoría (autenticación) sobre ellos. Se presentó una receta siguiendo unos pasos sencillos desde crear la libraría, generar la llave con la que vamos a asociar la librería, y finalmente el paso más importante, la instalación de la librería sobre el repositorio común GAC.

6. Glosario

  • Assembly
  • Criptografía
  • Ensamblado
  • Llave privada
  • Llave pública
  • Nombre seguro
  • Token

7. Enlaces & Literatura

[1]: Visual C# 2010 Recibes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Sn.exe (Strong Name Tool) - http://msdn.microsoft.com/en-us/library/k5b5tt23.aspx
[3]: Global Assembly Cache - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Global_Assembly_Cache
[4]: DLL Hell - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/DLL_hell
[5]: Gacutil.exe (Global Assembly Cache Tool) - http://msdn.microsoft.com/en-us/library/ex0ss12c.aspx
[6]: Microsoft Windows SDK - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Microsoft_Windows_SDK
[7]: SHA-1 - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/SHA-1
[8]: Criptografía asimétrica - Wikipedia, la enciclopedia libre - http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica
[9]: Windows PowerShell - Wikipedia, the free encyclopedia - http://es.wikipedia.org/wiki/Criptograf%C3%ADa_asim%C3%A9trica


O

No hay comentarios:

Publicar un comentario

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