Firmado de aplicaciones, librerías DLL y archivos comprimidos CAB en Windows Mobile

Tabla de contenidos

Firmado de ejecutables y librerías DLL con certificado del SDK
Despliegue de aplicaciones en Windows Mobile con certificado propio

Firmado de ejecutables y librerías DLL con certificado del SDK


Como se ha explicado en el apartado Arquitectura de capas de seguridad para ejecución de aplicaciones, los dispositivos Windows Mobile Professional soportan el modelo de una capa o One-tier access. Básicamente, la descripción de este modelo de capa de seguridad es la siguiente:

Un dispositivo con modelo de una capa decide únicamente si una aplicación puede ejecutarse o no, basándose en si está firmada con un certificado almacenado en el sistema. No decide los permisos con los que se va a ejecutar (con privilegios/normal); si una aplicación se ejecuta lo hace en el nivel de permisos más elevado: con privilegios.

Aplicación firmada con un certificado conocido

Se ejecuta sin comprobaciones adicionales de las políticas de seguridad. Tiene permiso para ejecutarse con privilegios: puede llamar a cualquier API, acceder a todo el sistema de archivos y modificar cualquier parte del registro.

Aplicación sin firmar o firmada con un certificado desconocido

En primer lugar se comprueba la política de seguridad que especifica si se permite la ejecución de aplicaciones no firmadas. En caso negativo, se bloquea la ejecución de la aplicación. En caso positivo, se comprueba la política de seguridad que especifica si se debe solicitar autorización al usuario para ejecutar una aplicación no firmada. En caso negativo, se ejecuta la aplicación con los mismos permisos que una aplicación firmada. En caso positivo, se solicita autorización al usuario. Si este acepta, la aplicación se ejecuta. Si no acepta, se bloquea la ejecución de la aplicación.

Así mismo, recordamos la configuración por defecto de las políticas de seguridad para ejecución de aplicaciones en Windows Mobile:

Por todo ello, si intentamos ejecutar una aplicación no firmada en un dispositivo Windows Mobile Professional, el sistema detendrá la ejecución de la aplicación y solicitará al usuario confirmar una autorización para continuar.

      


En el caso de que la aplicación conste de un servicio, si la librería DLL en que se basa no está firmada, el servicio no se lanzará al arrancar el sistema. La política de seguridad que especifica si se debe solicitar autorización al usuario para ejecutar una librería DLL no firmada no se tiene en cuenta en este punto.



Procedimiento de firmado de ejecutables y librerías DLL en Visual Studio


Para el firmado de ejecutables y librerías DLL destinados a dispositivos Windows Mobile Professional, el procedimiento es el siguiente:

1. Conseguir un certificado .pfx previamente instalado en el dispositivo o que pueda ser instalado antes de ejecutar la aplicación.

En este caso, vamos a utilizar el certificado de desarrollador para aplicaciones con privilegios que proporciona el SDK de Windows Mobile y que está disponible en C:\Program Files\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates, tanto el archivo SamplePrivDeveloper.pfx, que utilizaremos para firmar la aplicación, como Certs.cab, que utilizaremos para instalar el certificado en el dispositivo.


2. Importar el certificado .pfx al proyecto de Visual Studio.










Indicamos a Visual Studio que el Dispositivo de provisión, es decir, el almacén donde se alojará el certificado, es el Almacén de certificados con privilegios. De esta forma, nuestra aplicación tendrá permisos de ejecución al más alto nivel: podrá llamar a cualquier API, acceder a todo el sistema de archivos y modificar cualquier parte del registro. Esto en dispositivos Windows Mobile Professional no es importante, ya que todas las aplicaciones se ejecutan con el nivel de permiso más elevado, pero en dispositivos Windows Mobile Standard sí es necesario tenerlo en cuenta.


3. Recompilar la aplicación y aplicar el proceso de firmado.




El firmado de aplicaciones se lleva a cabo con la herramienta signtool.exe, disponible en C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\. Visual Studio integra esta herramienta en el IDE, pero también se puede llamar desde linea de comandos.


4. Llegados a este punto, si intentamos ejecutar la aplicación firmada en un dispositivo Windows Mobile Professional, nos encontraremos con que el sistema sigue bloqueando la ejecución de la misma y solicitando autorización al usuario para continuar.




La razón de esta advertencia es que, a pesar de que la aplicación está firmada, el certificado que presenta no es conocido para el sistema, no proviene de una autoridad de confianza, no está almacenado en el dispositivo y, por lo tanto, se aplica la misma política de seguridad que si la aplicación no estuviera firmada.


5. Instalar el certificado en el dispositivo

Con el fin de instalar el certificado con el que estamos trabajando, de forma que podamos ejecutar aplicaciones firmadas en el sistema, debemos desplegar el archivo comprimido CAB que contiene el certificado listo para ser agregado a alguno de los almacenes de certificados del dispositivo. En este caso, el certificado que hemos utilizado se alojará en el almacén de certificados con privilegios. Cualquier aplicación firmada con ese certificado podrá ejecutarse con el nivel de permisos más elevado, con privilegios.

Así pues, copiamos el archivo Certs.cab disponible en C:\Program Files\Windows Mobile 6 SDK\Tools\Security\SDK Development Certificates al dispositivo Windows Mobile Professional y desplegamos el CAB en el sistema para instalar el certificado.

  


Evidentemente, el archivo comprimido CAB que contiene el certificado también debe pasar el proceso de validación antes de poder desplegarse. Si el archivo CAB no está firmado o está firmado con un certificado no conocido, entonces el sistema solicitará autorización al usuario para poder instalarlo. Por lo general, a la hora de instalar certificados, el archivo CAB que los contiene no viene firmado y es necesario que el usuario autorice el despliegue. Pero esto sólo ocurre una vez. Con el certificado ya instalado en el dispositivo, cualquier aplicación, librería DLL o archivo comprimido CAB firmado con este certificado se validará correctamente y se ejecutará sin problema alguno.


6. Ejecutar la aplicación

Después de haber instalado el certificado SamplePrivDeveloper en el dispositivo, al intentar ejecutar la aplicación de nuevo, el sistema validará el certificado que presenta el ejecutable y comprobará que este no es desconocido, ya que está alojado en alguno de los almacenes de certificados del sistema. Por lo tanto validará la ejecución de la aplicación.




El modelo de capa de seguridad One-tier, soportado en los dispositivo Windows Mobile Professional, define que la ejecución de cualquier aplicación en el sistema siempre se lleva a cabo con el nivel de permiso más elevado: con privilegios. Por tanto, nuestra aplicación será capaz de llamar a cualquier API, acceder a todo el sistema de archivos y modificar cualquier parte del registro.


7. Conclusiones

El procedimiento explicado en este apartado permite firmar ejecutables para que puedan ser ejecutados en dispositivos Windows Mobile Professional. Para ello, ha sido necesario firmar el ejecutable con un certificado previamente instalado en el dispositivo o que es posible instalar antes de ejecutar la aplicación. El procedimiento para el firmado de librerías DLL es el mismo que el aplicado para firmado de ejecutables.

Es importante destacar que, aunque la ejecución de aplicaciones no firmadas puede llevarse a cabo si el usuario acepta la solicitud de autorización, este caso no se aplica a servicios o drivers, basados en librerías DLL. Estas librerías DLL se cargan en memoria en el momento de arranque del sistema y, durante este punto, la política de seguridad que especifica si se debe solicitar autorización al usuario para ejecutar una librería DLL no firmada no se tiene en cuenta. Por lo tanto, aquellos servicios o drivers basados en librerías DLL no firmadas no se lanzarán durante el arranque del sistema de ninguna forma.

Tambien conviene destacar que, antes de ejecutar una aplicación en un dispositivo, puede ser necesario instalar en el sistema el certificado con el que se ha firmado. Con el fin de evitar esta pre-instalación de certificado, en el siguiente apartado se explicará un procedimiento para desplegar aplicaciones en dispositivos Windows Mobile Professional con instalación de certificado simultánea incluida durante el despliegue.



Advertencia:


En el ejemplo anterior se ha utilizado el certificado SamplePrivDeveloper proporcionado por el SDK de Windows Mobile 6 con fines didácticos para ilustrar el procedimiento de firmado de aplicaciones. Este certificado puede ser utilizado únicamente para pruebas durante el desarrollo de aplicaciones Windows Mobile, en ningún caso puede ser utilizado para la distribución y comercialización de software. Para esto último, los fabricantes y desarrolladores deben suscribirse al programa de certificación Mobile2Market de Microsoft con el fin de validar y certificar sus aplicaciones y luego poder distribuirlas en el mercado.

Despliegue de aplicaciones en Windows Mobile con certificado propio


A la hora de desplegar aplicaciones en un dispositivo Windows Mobile, todos los ejecutables y librerías DLL necesarios se empaquetan en un archivo comprimido CAB. Este archivo CAB se utiliza para distribuir la aplicación. Sólo se necesita copiar el archivo CAB al dispositivo y desplegarlo con wceload.exe.

La arquitectura de seguridad de Windows Mobile define las siguientes políticas en relación con la instalación de archivos comprimidos CAB:

Así mismo, todos los ejecutables y librerías DLL comprimidos en el archivo CAB se ajustan a las siguientes políticas de ejecución de aplicaciones en Windows Mobile:

El objetivo, por tanto, es firmar todos los ejecutables y librerías DLL de nuestra aplicación con un certificado propio, así como el archivo CAB que contiene la aplicación, e instalar este certificado en el dispositivo durante el despliegue del archivo CAB. De esta forma, con el certificado instalado en el sistema, todos los ejecutables y librerías DLL se ejecutarán sin problema alguno. Tan sólo será necesario solicitar una única autorización al usuario, a la hora de desplegar el archivo CAB en el dispositivo.

El procedimiento de generación de certificado propio y firmado del archivo comprimido CAB que contiene la aplicación que voy a seguir está basado en el siguiente artículo http://www.codeproject.com/KB/mobile/signcode.aspx


Generar un certificado propio


1. Crear el certificado con makecert.exe




2. Crear el certificado .pfx a partir del .cer

Con el certificado MiCert.cer y la clave privada MiCert.pvk, creamos el certificado MiCert.pfx, que es el que necesita signtool.exe para el firmado de aplicaciones, con ayuda de la herramienta pvk2pfx.exe




3. Crear el provisioning XML

El certificado que hemos generado y que hemos utilizado para firmar los ejecutables y librerías DLL de nuestra aplicación debe adjuntarse en el archivo CAB a través de un documento XML, denominado provisioning XML. Este documento se especifica en el parámetro /prexml a la hora de empaquetar la aplicación en el archivo CAB con la herramienta cabwiz.exe. Al desplegar el archivo CAB en el sistema, el Configuration Manager accederá a este provisioning XML para obtener el certificado con el que se ha firmado el CAB y los ejecutables y librerías DLL que contiene.

La estructura del documento provisioning XML es la siguiente:

<characteristic type="CertificateStore">
  <characteristic type="Privileged Execution Trust Authorities">
    <characteristic type="[cert_sha1]">
      <parm name="EncodedCertificate" value="[cert_base64]" />
    </characteristic>
  </characteristic>
</characteristic>
<characteristic type="CertificateStore">
  <characteristic type="SPC">
    <characteristic type="[cert_sha1]">
      <parm name="EncodedCertificate" value="[cert_base64]" />
      <parm name="Role" value="222" />
    </characteristic>
  </characteristic>
</characteristic>


En este esquema, debemos sustituir [cert_sha1] y [cert_base64] con los valores respectivos de nuestro certificado MiCert.cer. Para ello utilizamos la herramienta openssl.exe




Rellenamos el esquema del documento provisioning XML con los valores sha1 y base64 de nuestro certificado generado y lo guardamos como PREXML.xml

<characteristic type="CertificateStore">
  <characteristic type="Privileged Execution Trust Authorities">
    <characteristic type="a8aa37447c4866d53d1e431bdd99c075ec8b9650">
      <parm name="EncodedCertificate" value="MIIB7zCCAVigAwIBAgIQU9Z8HWvT84tK6lbDaijO8zANBgkqhkiG9w0BAQQFADAR
MQ8wDQYDVQQDEwZNaUNlcnQwIBcNOTkxMjMxMjIwMDAwWhgPMjA5ODEyMzEyMjAw
MDBaMBExDzANBgNVBAMTBk1pQ2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEArqbP45jQwdGDYHbmHrV7jH40zi9HGf8P2IFwz0ejoRlpvZabvTQEJVxu9L/N
qcqtTMTU2DWEqhHRdpsr4We+8uJyZFxoVL+nuHFIdHQyYVNFI9EwhcgzN+oO3uoi
MWGi7wTE4v/8YPqb8bRByfNw7BxT4FxuW9k/w0dtkLYuWUcCAwEAAaNGMEQwQgYD
VR0BBDswOYAQldDnUv0nENnoffKw7Je6JqETMBExDzANBgNVBAMTBk1pQ2VydIIQ
U9Z8HWvT84tK6lbDaijO8zANBgkqhkiG9w0BAQQFAAOBgQBF1qiNQ9sqCBdQ+T4T
lnxp/JCHh3d2eB9pX+spGouGQtTnPtS61aPpNU7WhvMGBDhuyqsVayBaLc/5UzdJ
M7cKJQLkisZhe/2UrM4+PU7QNG2z2Omd/32QIOGVzUcWOWa3D9tU1VsHhvCyNG8K
dTuMJAYXC5vlmgXRp2vk4qpR1w==
" />
    </characteristic>
  </characteristic>
</characteristic>
<characteristic type="CertificateStore">
  <characteristic type="SPC">
    <characteristic type="a8aa37447c4866d53d1e431bdd99c075ec8b9650">
      <parm name="EncodedCertificate" value="MIIB7zCCAVigAwIBAgIQU9Z8HWvT84tK6lbDaijO8zANBgkqhkiG9w0BAQQFADAR
MQ8wDQYDVQQDEwZNaUNlcnQwIBcNOTkxMjMxMjIwMDAwWhgPMjA5ODEyMzEyMjAw
MDBaMBExDzANBgNVBAMTBk1pQ2VydDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEArqbP45jQwdGDYHbmHrV7jH40zi9HGf8P2IFwz0ejoRlpvZabvTQEJVxu9L/N
qcqtTMTU2DWEqhHRdpsr4We+8uJyZFxoVL+nuHFIdHQyYVNFI9EwhcgzN+oO3uoi
MWGi7wTE4v/8YPqb8bRByfNw7BxT4FxuW9k/w0dtkLYuWUcCAwEAAaNGMEQwQgYD
VR0BBDswOYAQldDnUv0nENnoffKw7Je6JqETMBExDzANBgNVBAMTBk1pQ2VydIIQ
U9Z8HWvT84tK6lbDaijO8zANBgkqhkiG9w0BAQQFAAOBgQBF1qiNQ9sqCBdQ+T4T
lnxp/JCHh3d2eB9pX+spGouGQtTnPtS61aPpNU7WhvMGBDhuyqsVayBaLc/5UzdJ
M7cKJQLkisZhe/2UrM4+PU7QNG2z2Omd/32QIOGVzUcWOWa3D9tU1VsHhvCyNG8K
dTuMJAYXC5vlmgXRp2vk4qpR1w==
" />
      <parm name="Role" value="222" />
    </characteristic>
  </characteristic>
</characteristic>


Ahora estamos preparados para empaquetar nuestra aplicación en un archivo CAB y adjuntar el provisioning XML que acabamos de crear.



Firmar la aplicación con el certificado propio


Tal y como hemos visto en el apartado anterior, podemos importar el certificado .pfx al proyecto de Visual Studio.










Después de indicar a Visual Studio que utilice nuestro certificado para firmar la aplicación, recompilamos el proyecto.





Empaquetar la aplicación y adjuntar el certificado en el archivo CAB

Una vez dispongamos de todos los ejecutables y librerías DLL de nuestra aplicación ya firmados con el certificado propio, los copiamos a una carpeta /install, junto con el documento provisioning XML que acabamos de crear, y definimos el archivo de información .INF que necesita C:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\Cabwiz.exe para generar el archivo comprimido CAB que desplegará la aplicación en el dispositivo.

Para más información sobre la herramienta CABWIZ y la generación de archivos CAB, consultar MSDN.

Ejemplo Demo.inf

[Version]
Signature = "$Windows NT$"
Provider = "Mossec"
CESignature = "$Windows CE$"

[CEStrings]
AppName = "Demo"
InstallDir = %CE1%"\Demo\Demo"

[CEDevice]
VersionMin=4.00
VersionMax=4.99
BuildMax=0xE0000000

[Strings]

;==================================================

[DefaultInstall]
CopyFiles = Sourcefiles

;==================================================

[SourceDisksNames]
1 =, "Common Files",,

[SourceDisksFiles]
Demo.exe = 1

;==================================================

; Ouput directories for files & shortcuts

[DestinationDirs]
Sourcefiles = 0, %InstallDir%

[Sourcefiles]
"Demo.exe"

Ejecutamos la herramienta cabwiz.exe para crear el archivo CAB. Le pasamos como parámetros el archivo .INF y el documento provisioning XML.




Para finalizar, firmamos con el certificado .pfx el archivo CAB generado con la herramienta signtool.exe





Desplegar la aplicación en el dispositivo Windows Mobile Professional


Ahora sólo nos queda desplegar el archivo CAB en el dispositivo Windows Mobile Professional. Para ello copiamos el archivo CAB generado y firmado al sistema y lo desplegamos con wceload.exe.




Al intentar instalar el archivo CAB, el sistema validará el certificado con el que se ha firmado. Como este certificado no es conocido, se aplicará la política de solicitar al usuario autorización para instalar el CAB. Si el usuario acepta, entonces la aplicación se desplegará con éxito y, al mismo tiempo, se instalará el certificado adjunto al CAB (provisioning XML) en el dispositivo.

  


Tras la instalación, nuestra aplicación estará disponible en la ruta indicada en el archivo .INF, en este caso, \Archivos de programa\Demo\Demo\Demo.exe.

Dado que hemos firmado la aplicación Demo.exe con el certificado propio y este se ha instalado en el sistema durante el despliegue del archivo CAB, la aplicación será validada por el sistema y se ejecutará sin problema alguno.

 



Conclusiones


El procedimiento explicado en este apartado permite desplegar una aplicación en dispositivos Windows Mobile Professional al tiempo que se instala el certificado propio con el que se ha firmado esa aplicación. Para ello, ha sido necesario generar un certificado con ayuda de las herramientas de Visual Studio y OpenSSL. Posteriormente, se ha firmado la aplicación con el certificado generado, se ha empaquetado la aplicación en un archivo CAB en el que se adjunta el certificado y, por último, se firma el propio archivo CAB. Al desplegar el archivo CAB en el dispositivo Windows Mobile Professional, el usuario debe autorizar la instalación, ya que el certificado que presenta no está almacenado en el sistema. Si el usuario acepta instalar la aplicación, se instalará también el certificado adjunto, permitiendo que los ejecutables y librerías DLL firmados con este certificado se ejecuten sin problema alguno en el dispositivo.



Advertencia:


En el ejemplo anterior se ha utilizado un certificado propio generado con las herramientas de Visual Studio y OpenSSL con fines didácticos para ilustrar el procedimiento de despliegue de aplicaciones en dispositivos Windows Mobile Professional. Este certificado puede ser utilizado únicamente para pruebas durante el desarrollo de aplicaciones Windows Mobile, en ningún caso puede ser utilizado para la distribución y comercialización de software. Para esto último, los fabricantes y desarrolladores deben suscribirse al programa de certificación Mobile2Market de Microsoft con el fin de validar y certificar sus aplicaciones y luego poder distribuirlas en el mercado.


(Parte de la información de esta página está basada en la base de conocimientos de Microsoft Technet sobre seguridad en Windows Mobile. Para más información, acudir a la fuente original.)

© 2005 - 2011 Alberto Moreno Tablado