| Artículos | 01 SEP 2007

Cómo firmar código .NET

Tags: Histórico
Autoría de programas para su distribución por Internet
Gonzalo Alvarez.
Cuando se descarga código a través de internet uno nunca está seguro de quién ha creado el código o si ha sido modificado, por mucho que se descargue desde un sitio web oficial. La única manera de tener una certeza acerca de la identidad del autor del código y de su integridad consiste en utilizar firmas digitales. En este artículo se explica cómo firmar el código .NET.

Cuando uno compra software en la tienda, bien empaquetado y con sus sellos holográficos, está bastante seguro de su originalidad y autoría. Sin embargo, cuando se descarga desde internet, incluso aunque lo haga desde la web del creador, uno ya no está tan seguro. Por supuesto, si se descarga desde una web de terceros, entonces ya no existe absolutamente ninguna garantía. Igualmente, resulta frecuente encontrarse con pequeños programas ActiveX que quieren ejecutarse mientras se navega por internet. En todos estos casos, ¿existe alguna manera de tener al menos una cierta certeza respecto a la autoría del software? Incluso aunque se esté seguro de que ese software fue escrito originalmente por cierta compañía o individuo, ¿es posible garantizar que no ha sido manipulado maliciosamente? Afortunadamente, todos estos interrogantes tienen una respuesta afirmativa: la firma de código mediante certificados digitales.
El proceso de firma de código consiste en la creación de una firma digital que se añade al archivo ejecutable portable o PE (.exe o .dll) al archivo CAB o al instalador (.msi). La firma digital se crea calculando un hash del binario y cifrando este hash con la clave privada del autor. Por consiguiente, en primer lugar, para poder firmar es necesario contar con un certificado digital de firma de código. La primera parte de este artículo explicará cómo obtenerlo. En segundo lugar, se pueden utilizar herramientas proporcionadas por el SDK de .NET Framework para firmar y verificar las firmas. La segunda parte de este artículo explicará el proceso.

Herramientas de seguridad del SDK de .NET Framework
El SDK de .NET Framework incluye numerosas herramientas de línea de comando y de guía para ayudar al programador en sus tareas: para configuración y despliegue, para depuración, para seguridad y para trabajos de propósito general. En el contexto de los certificados, el SDK incluye una serie de herramientas para el trabajo con certificados y para firma de código:
SignTool.exe: Firma archivos digitalmente, verifica las firmas y puede sellarlos temporalmente.
Cert2Spc.exe: Crea un certificado de firma de código (Software Publisher’s Certificate, SPC) a partir de uno o más certificados X509. Utilícese sólo para pruebas.
CertMgr.exe: Gestiona almacenes de certificados, listas de certificados de confianza (CTL) y listas de revocación de certificados (CRL).
ChkTrust.exe: permite comprobar la validez de un archivo firmado con un certificado X509. Esta herramienta se distribuye con .NET 1.x. En .NET 2.0 debe utilizarse en su lugar SignTool.exe.
MakeCert.exe: permite crear certificados digitales X509 únicamente con el propósito de realizar pruebas.
Signcode.exe: firma archivos de ejecutables portables (PE) con una firma digital Authenticode. Esta herramienta se distribuye con .NET 1.x. En .NET 2.0 debe utilizarse en su lugar SignTool.exe.
En adelante, se asume que el lector tiene instalado .NET Framework v2.0 o superior.

Creación de los certificados de prueba
Para ilustrar los conceptos de firma de código en .NET se utilizará un certificado digital de prueba generado mediante la herramienta MakeCert. Para invocarla, abra primero una ventana de símbolo del sistema que incluya en su ruta de búsqueda a todas las herramientas del SDK, seleccionando Inicio•Todos los programas• Microsoft .NET Framework SDK v2.0•Símbolo del sistema de SDK. A continuación ejecute el comando
makecert
Se mostrará un listado de la sintaxis del mismo y de las opciones disponibles. En este artículo se usarán las siguientes:
-sk <keyName>: Especifica un nombre de contenedor de claves. Si no existía, se creará.
-ss <store>: Especifica el nombre del almacén de certificados donde se guardará el certificado generado.
-n <X509name>: Especifica un nombre X509 para el titular del certificado.
-sv <pvkFile>: Especifica un nombre de archivo donde almacenar la clave privada. Este archivo se protege por una contraseña.
La herramienta MakeCert es ciertamente compleja, por lo que sólo se explicarán los aspectos más relevantes para la firma de código. En primer lugar, hay que decidir si se desea que el certificado se guarde en un archivo o en un almacén de certificados. En el primer caso, puede ejecutarse un comando como el siguiente:
makecert joe.cer
Se comprobará cómo se ha creado un archivo joe.cer que contiene un certificado emitido por la autoridad de certificación Root Agency a nombre de Joe’s-Software-Emporium. Si quiere que el certificado contenga sus propios datos personales, puede especificar un nombre común y una dirección de correo utilizando la opción -n de la siguiente manera:
makecert -n “CN=Gonzalo Alvarez;E=gonzalo@pcw.idg.es” gonzalo.cer
Hasta ahora no se ha almacenado la clave privada en ningún sitio. Ahora bien, para poder firmar es necesario contar con dicha clave. Puede especificarse un archivo mediante la opción -sv. Dado que la seguridad de la clave privada es de vital importancia, el acceso a este archivo se protege con una contraseña:
makecert -sv gonzalo.pvk -n “CN=Gonzalo Alvarez;E=gonzalo@pcw.idg.es” gonzalo.cer
Cuando ejecute el comando, una ventana le solicitará dos veces la contraseña que protege la clave privada. Elija una buena contraseña y no la olvide, ya que en tal caso no podría firmar nuevos archivos. Esta contraseña se le pedirá en el futuro en cada operación de firma que realice. Si la olvida o pierde el archivo, habría que revocar el certificado y crear uno nuevo. Una vez creada la contraseña se le vuelve a solicitar.
Si en lugar de almacenar el certificado en un archivo se desea utilizar un almacén de certificados, habrá que especificarlo mediante la opción -ss. Para este tipo de certificados de usuario lo más normal es utilizar el almacén personal (“MY”) del usuario actual, supuestamente el desarrollador de software o la persona encargada de firmar el software. Si se ejecuta el siguiente comando:
makecert -n “CN=Gonzalo Alvarez;E=gonzalo@pcw.idg.es” -ss MY
se creará una entrada en el almacén Personal con el certificado correspondiente. Para visualizar estos almacenes puede utilizarse el complemento de administración Certificados. Para abrirlo, seleccione Inicio•Ejecutar y escriba “certmgr.msc”. Otra herramienta que puede utilizarse para gestionar los certificados es CertMgr. Para abrirla, ejecute en el símbolo del sistema de SDK el comando
certmgr
Se abrirá una ventana idéntica a la que se accede por ejemplo desde Internet Explorer cuando se selecciona Herramientas• Opciones de Internet•Contenido•Certificados.
Nuevamente, habrá comprobado que la clave privada no aparece por ningún lado. Para poder almacenarla como en el caso anterior debe especificarse un contenedor de claves mediante la opción -sk, como

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información