Cómo
firmar Applets Java para Internet Explorer, usando herramientas Microsoft
Fuente:
http://www.iec.csic.es/criptonomicon/java/ie.html
Modificado
por: Ing. Cristhian Herrera
La
ventaja de la creación de applets firmados para Internet Explorer es que no se
necesita añadir código especial al fichero fuente del applet, ni realizar
llamadas a funciones criptográficas. Para firmar cualquier applet no se
requiere modificarlo en absoluto.
Software
Necesario en el cliente
- Microsoft Internet Explorer 5.02 o superior
- Microsoft JVM (Actualizada)
Software
Necesario para firmar applets y construir archivos contenedores (.cab)
Antes de comenzar
asegúrese de disponer de las siguientes herramientas:
- cabarc.exe
- cabinet.dll
- cert2spc.exe
- certmgr.exe
- chktrust.exe
- extract.exe
- makecab.exe
- makecert.exe
- setreg.exe
- signcode.exe
- Javasign.dll
- chkjava.exe
Las primeras pueden ser
descargadas desde el sitio web de Microsoft, mientras que la utilidad “Javasign.dll”
(que otorga permisos especiales a las clases java) y el programa “chkjava.exe”
(que sirve para verificar la integridad de un contenedor de clases) están
disponibles en el sitio de SUN y en otros mirrors de Internet ya que Microsoft
dejó de soportarlas debido a sus problemas legales con SUN.
Estos archivos deben
encontrarse en un PATH válido en el directorio del sistema de la máquina de
desarrollo, por defecto este directorio es Winnt\System32.
Una vez que se dispone de
las herramientas necesarias, se puede proceder a firmar applets siguiendo los
siguientes pasos:
Paso 1: Crear
un certificado para firmar applets
En el caso de Microsoft se
necesita un certificado adecuado para su modelo de Authenticode. Existen muchas
autoridades de certificación que distribuyen tales certificados, como VeriSign.
Para uso personal se debe solicitar un certificado de clase 2 mientras que para
uso comercial se necesita uno de clase 3.
Dado que el propósito de esta propuesta
es experimentar con las firmas y no vender ni distribuir software firmado, no
obstante se puede utilizar un certificado de prueba, que es gratis y se puede
obtener a partir de las propias herramientas del SDK para Java.
En el directorio \bin\PackSign
se encuentran las herramientas en línea de comandos que crearán un certificado
de prueba. Por ejemplo, si se quiere crear un certificado para “MyTestCert”
de la compañía “My Company Name”, se hará lo siguiente:
makecert -sk
MyKeyName -n «CN=My Company Name» MyTestCert.cer
Este comando crea una pareja
de claves, pública y privada, y un fichero de petición de certificado (MyTestCert.cert),
a partir de la clave pública y la información de la compañía (campo CN).
Para ello emplea la clave de registro de Windows “MyKeyName”. Si no se le
suministra ninguna, makecert la crea.
Sin embargo, este
certificado no sirve para firmar código. En su lugar se necesita un Certificado
de Productor de Software (Software Publisher Certificate, SPC), el cual debe
obtenerse de una Entidad Emisora de Certificados Digitales(EMCD), a la que se
envía este certificado recién generado para que lo autentique y lo firme. En
su defecto, y sólo con fines de prueba, existe otra herramienta del SDK que
permite transformar el certificado anterior en uno válido, de la siguiente
forma:
cert2spc MyTestCert.cer MyTestCert.spc
Ahora ya se puede utilizar
este certificado, MyTestCert.spc, para firmar código, con prestaciones
similares a las que poseería si hubiera procedido de una EMCD.
Paso 2: Crear
el CAB
La firma basada en
Authenticode funciona con ficheros armario (Cabinet, CAB). Los ficheros CAB
constituyen simplemente una manera de compactar varios ficheros en uno solo en
un formato que pueda entender IE. Para archivar varios ficheros se puede
utilizar la herramienta cabarc o makecab. Por ejemplo, para
comprimir los ficheros fich1.class y fich2.class en uno solo se utilizaría:
cabarc n
fich.cab fich1.class fich2.class
donde la opción n indica
que se quiere crear un nuevo fichero. También se pueden utilizar metacaracteres,
incluir subdirectorios, etc.
Por ejemplo si se dispone de
un applet llamado Mi_clase.java, capaz de escapar del recinto de seguridad y
leer propiedades del sistema y escribir ficheros. Una vez compilado, se puede
crear un fichero contenedor de la siguiente forma:
cabarc
n Mi_clase.cab Mi_clase.class
Utilizando el comando
makecab la instrucción sería:
makecab
Mi_clase.class Mi_clase.cab
Paso 3: Firmar
el CAB
El SDK incorpora la
herramienta signcode para firmar código. En este paso conviene decidir
qué nivel de seguridad se le desea asignar, ya que en función de dicho nivel y
de la configuración de las zonas de seguridad en el navegador del usuario, el
resultado será que se presenten más o menos ventanas pidiendo al usuario
confirmación antes de permitir que el applet escape de los confines del recinto
de seguridad (área “sandbox” de la Java Virtual Machine – JVM).
El comando para firmar el
código es:
signcode
-spc MyTestCert.spc -k MyKeyName Mi_clase.cab
Para confirmar que todo el
proceso se ha realizado correctamente, se puede ejecutar el comando:
chkjava
Mi_clase.cab ó también chktrust Mi_clase.cab
Por defecto, signcode
requiere permisos totales, como se ha podido comprobar al ejecutar el comando
chkjava. Si se desea, se puede añadir información de permisos de Java a la
firma para controlar más finamente el tipo de recursos a los que tendrá acceso
el applet, usando la opción -j JavaSign.dll de signcode, con la siguiente
sintaxis:
signcode
[opciones] -j JavaSign.dll [-jp nivel] [más opciones]
donde nivel es opcional y
será uno de los seis siguientes: Low, Medium, High, Lowx, MediumX, HighX. Por
defecto, el nivel de seguridad será Lowx.
Para el caso del ejemplo
anterior la instrucción completa sería la siguiente:
signcode
-j javasign.dll -jp low -spc MyTestCert.spc -k MyKeyName Mi_clase.cab
Si se desea configurar los
permisos aún más granularmente, se pueden utilizar ficheros de configuración,
con extensión .ini. Si después de la opción -jp no se incluye uno de los seis
nombres anteriores, signcode entenderá que lo que venga a continuación es el
nombre de un fichero .ini con la configuración. Para confeccionar estos
ficheros de configuración existe una herramienta gráfica incluida en el SDK,
llamada PIniEdit. A continuación se muestra un ejemplo de un fichero tal, que
permitiría leer y escribir todos los ficheros del directorio c:\temp, excepto
los documentos de Word (extensión .doc):
[com.ms.security.permissions.FileIOPermission]
Version=2
IncludeRead=c:\temp\*.*;
IncludeWrite=c:\temp\*.*;
ExcludeRead=c:\temp\*.doc;
Junto con PIniEdit se
distribuye un fichero con instrucciones precisas sobre su uso. Se puede ampliar
la información respecto a todos los demás aspectos de la firma de código
escrito en Java en la página
de Microsoft.
Paso 4:
Incrustar el CAB en la página web
Ya sólo queda incluir las
etiquetas correctas para que se visualice el applet sin problemas, lo cual exige
variar ligeramente el formato de la etiqueta <applet> convencional:
<applet
code=»Mi_clase.class»>
<param name=»cabbase»
value=»Mi_clase.cab»>
</applet>
Es importante eliminar el
fichero Mi_clase.class original del directorio, ya que en caso contrario el
navegador lo cargaría, en lugar del firmado. El applet ya está listo para
ejecutarse en Internet Explorer. En adelante, cuando el visitante a su web
cargue la página donde se aloja el applet firmado, le aparecerá una advertencia
de seguridad solicitándole su aprobación para
instalarlo y ejecutarlo. Si el visitante acepta, el applet se ejecutará para
acceder sin restricciones a todos aquellos recursos que se solicitaron en el
fichero .ini de permisos creado mediante la herramienta PIniEdit y utilizado en
el proceso de firmado. Puede examinar con más detalle los permisos solicitados,
para decidir si aprobar o no su ejecución. Si el visitante deniega los
permisos, entonces el applet no se ejecuta en absoluto. También puede comprobar
el certificado si así lo requiere.


Establecer los
permisos de seguridad JAVA para Internet Explorer
En algunos casos será
necesario además configurar los permisos de Internet Explorer como se muestra a
continuación:
En el escritorio de
Windows haga clic derecho sobre el icono del Internet Explorer, luego escoja la
viñeta de “Seguridad”, en esta ubique la zona de navegación que desea
personalizar por ejemplo la zona “Internet”.
Presione el botón “Personalizar
nivel…” y se abrirá una nueva ventana que dice “Configuración de
seguridad” en ella busque la sección correspondiente a “Microsoft VM –
Permisos de Java” y haga clic en “Personalizada”, luego presione el botón
“Configuración de Java Personal…”
Se presentará
una subpantalla que contiene una viñeta que dice “Internet” como se muestra
a continuación:


En esta ventana tenemos dos
categorías de opciones referentes a los applets firmados y aquellos no
firmados. Si dispone de un applet firmado con un certificado digital válido
entonces no es necesario que modifique los permisos en la categoría “Contenido
sin firmar”.
Permisos
a modificar en el Contenido sin firmar
Etiqueta |
Valor |
Ejecutar el contenido sin |
Ejecutar en el recinto de |
Tener acceso a todos los |
Desactivar |
Tener acceso a todas las |
Activar |
Ejecutar |
Activar |
Dialogs |
Activar |
Información del sistema |
Activar |
Permisos
a modificar en el Contenido sin firmado
Etiqueta |
Valor |
Ejecutar el contenido |
Preguntar al usuario |
Tener acceso a todos los |
Desactivar |
Tener acceso a todas las |
Preguntar al usuario |
Ejecutar |
Preguntar al usuario |
Dialogs |
Preguntar al usuario |
Información del sistema |
Preguntar al usuario |