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 aplicaciones, librerías DLL y archivos comprimidos CAB en Windows Mobile
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. |
Así mismo, recordamos la configuración por defecto de las políticas de seguridad para ejecución de aplicaciones en Windows Mobile:
- Permitir o bloquear la ejecución de aplicaciones y librerías DLL no firmadas. (Por defecto, permitir)
- Especificar si se debe solicitar al usuario la autorización para ejecutar aplicaciones, librerías DLL y archivos comprimidos CAB no firmados. (Por defecto, preguntar al usuario)
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:
- Permitir o bloquear la instalación de archivos comprimidos CAB no firmados (Por defecto, permitir)
- Especificar si se debe solicitar al usuario la autorización para ejecutar aplicaciones, librerías DLL y archivos comprimidos CAB no firmados. (Por defecto, preguntar al usuario)
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:
- Permitir o bloquear la ejecución de aplicaciones y librerías DLL no firmadas. (Por defecto, permitir)
- Especificar si se debe solicitar al usuario la autorización para ejecutar aplicaciones, librerías DLL y archivos comprimidos CAB no firmados. (Por defecto, preguntar al usuario)
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.)
