Está en la página 1de 12

Cmo firmar un Java Applet?

marzo 10, 2008


adagioparacuerdas IT certificados digitales, firmar applet, firmar jar, signar applet, signar jar 10 comentarios

En este artculo explicaremos como firmar un applet con un certificado propio o uno CA. Para el desarrollo se emplea las herramientas disponibles en el Kit de Desarrollo jdk1.6.0_04. Llamaremos %JPATH% al directorio donde se encuentran los ejecutables del JDK, por ejemplo C:\Archivos de programa\Java\jdk1.6.0_04\bin. En Netbeans he modificado una aplicacin que usa libreras que implementan el protocolo IAX2 y el resultado final es un softphone desplegable en una simple pgina html. Agregar la ruta de los binarios de Java a la variable de entorno PATH Para poder trabajar con los ejecutables del JDK desde cualquier directorio agregaremos la ruta %JPATH% a la variable de entorno PATH. Seleccionamos Propiedades dentro del Menu contextual sobre Mi PC. Bajo la pestaa de Opciones avanzadas hacemos click sobre el botn Variables de entorno. Buscamos y hacemos click sobre Path entre lasVariables de sistema, luego hacemos click sobre el botn Modificar y en el Valor de la variable agregamos al final un punto y coma (;) seguido de %JPATH%. Creacin de la llave Usaremos el algoritmo RSA y el alias cg1key. C:\>keytool -genkey -keyalg rsa -alias cg1key Escriba la contrasea del almacn de claves: ******** Cul es son su nombre y su apellido? [Unknown]: Franco Cedillo Cul es el nombre de su unidad de organizacin? [Unknown]: IT Cul es el nombre de su organizacin? [Unknown]: CyberGod Cul es el nombre de su ciudad o localidad? [Unknown]: Lima Cul es el nombre de su estado o provincia? [Unknown]: Lima Cul es el cdigo de pas de dos letras de la unidad? [Unknown]: PE Es correcto CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE? [no]: si Escriba la contrasea clave para <cg1key> (INTRO si es la misma contrasea que la del almacn de claves): ENTER Exportacin de la llave C:\>keytool -export -alias cg1key -file cg1key.crt Escriba la contrasea del almacn de claves: Certificado almacenado en el archivo <cg1key.crt> Compilacin de Applet Basta con colocarse en el directorio build dentro de la ruta de nuestro projecto. All debemos ubicar las bibliotecas JAR empleadas y un archivo con el texto que requerimos en el manifiesto. El manifiesto es un archivo de texto que puede tener la siguiente estructura: Manifest-Version: 1.0 Ant-Version: Apache Ant 1.7.0 Created-By: 10.0-b19 (Sun Microsystems Inc.) X-COMMENT: Main-Class will be added automatically by build Class-Path: inifile.jar jiaxc_windows_x86.jar jiaxc_windows_x86_md5.jar jiaxclient.jar libjiaxc.jar swing-layout1.0.jar Para este ejemplo he llamado mymanifest al archivo de texto que ser agregado como manifiesto al archivo

JAR que generar. En la lnea de comando ejecutamos: \build>jar cvfm jiaxTest.jar mymanifest -C classes . manifest agregado agregando: Click2Call.gif (entrada = 6574) (salida = 6537) (desinflado 0%) agregando: IaxTestApplet.class (entrada = 3062) (salida = 1507) (desinflado 50%) agregando: PhonePanel$1.class (entrada = 1193) (salida = 652) (desinflado 45%) agregando: PhonePanel$2.class (entrada = 766) (salida = 471) (desinflado 38%) agregando: PhonePanel$3.class (entrada = 698) (salida = 426) (desinflado 38%) agregando: PhonePanel$4.class (entrada = 698) (salida = 429) (desinflado 38%) agregando: PhonePanel$Listener.class (entrada = 4416) (salida = 1957) (desinflad o 55%) agregando: PhonePanel.class (entrada = 14948) (salida = 6090) (desinflado 59%) Firma de bibliotecas JARs necesarias \build>jarsigner inifile.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner jiaxc_windows_x86.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner jiaxc_windows_x86_md5.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner jiaxclient.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner libjiaxc.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner swing-layout-1.0.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. \build>jarsigner jiaxTest.jar cg1key Enter Passphrase for keystore: ******* Warning: The signer certificate will expire within six months. Verificacin de Firma o Signado Verificaremos uno de todos los JARs que hemos signado. \build>jarsigner -verify -verbose -certs jiaxTest.jar 857 Fri Mar 07 13:44:46 COT 2008 META-INF/MANIFEST.MF 762 Fri Mar 07 13:44:48 COT 2008 META-INF/CG1KEY.SF 913 Fri Mar 07 13:44:48 COT 2008 META-INF/CG1KEY.RSA 0 Fri Mar 07 13:39:52 COT 2008 META-INF/ smk 6574 Wed Mar 05 17:41:44 COT 2008 Click2Call.gif X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)

[certificate will expire on 5/06/08 12:54] smk 3062 Wed Mar 05 17:41:44 COT 2008 IaxTestApplet.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 1193 Wed Mar 05 17:41:44 COT 2008 PhonePanel$1.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 766 Wed Mar 05 17:41:44 COT 2008 PhonePanel$2.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 698 Wed Mar 05 17:41:44 COT 2008 PhonePanel$3.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 698 Wed Mar 05 17:41:44 COT 2008 PhonePanel$4.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 4416 Wed Mar 05 17:41:44 COT 2008 PhonePanel$Listener.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] smk 14948 Wed Mar 05 17:41:44 COT 2008 PhonePanel.class X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key) [certificate will expire on 5/06/08 12:54] s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified. Warning: This jar contains entries whose signer certificate will expire within six months. Desplegado de Applet Finalmente inclumos el cdigo de llamada al Applet desde una sencilla pigna HTML. Fuente Signed Applets How to sign an applet (and get it to work)

http://francocedillo.wordpress.com/2008/03/10/%C2%BFcomo-firmar-un-java-applet/

Por qu los applet no tienen permiso


Un Applet por defecto no puede acceder a los recursos del ordenador donde se est visualizando, ni disco duro, ni impresora ni ninguna otra cosa. Tampoco puede establecer conexiones con otros ordenadores que no sean el servidor de dnde viene. El motivo de esto es sencillo. Yo podra hacer y poner en esta pgina un Applet que borre el disco duro del que navega y vea esta pgina. Slo por visualizar esta pgina, se borrara el disco duro. Eso, evidentemente, es muy inseguro. Por ello, el navegador, que es donde se ejecuta el Applet, restringe mucho los permisos del Applet. Sin embargo, para dar funcionalidad al Applet, a veces es necesario que este pueda acceder al disco duro. La forma de conseguir esto es firmar el Applet digitalmente. Cuando el navegador visualiza un Applet firmado, le saca al navegante un aviso que ms o menos dice esto

Este Applet est firmado por Fulanito de los Palotes. Pulse "Aceptar" slo si confa en Fulanito de los Palotes.

Si aceptamos, le estamos diciendo al navegador que confiamos ciegamente en Fulanito de los Palotes, as que el navegador confiar en el Applet y le dar los permisos de acceso al disco duro, a la impresora y lo dems.

Ejemplo de cmo firmar un Applet


El cdigo para nuestro Applet puede ser algo sencillo, por ejemplo, sacar una lista con los ficheros en el directorio raz del usuario que ve nuestro applet.

package chuidiang.applet; import java.io.File; import import import import javax.swing.DefaultListModel; javax.swing.JApplet; javax.swing.JList; javax.swing.JScrollPane;

public class AppletFirmado extends JApplet { public void init() { DefaultListModel modelo = new DefaultListModel();

JList lista = new JList(modelo); JScrollPane scroll = new JScrollPane(lista); add(scroll); rellenaListaConFicheroDeDirectorioRaiz(modelo); } private void rellenaListaConFicheroDeDirectorioRaiz(DefaultListModel modelo) { File directorioRaiz = new File("/"); String [] ficheros = directorioRaiz.list(); for (int i=0;i<ficheros.length;i++) modelo.addElement(ficheros[i]); } }

Generamos un jar con nuestro applet. Puedes ver cmo se hace un jar en cmo generar un jar. Al jar podemos llamarle, por ejemplo appletfirmado.jar, aunque todava no est firmado. Creamos una pgina html de prueba para nuestro applet, despus de haber generado el jar. La pgina puede ser tan tonta como esta

<html> <head> </head> <body> <applet code="chuidiang.applet.AppletFirmado" archive="appletfirmado.jar" width=400 height=400></applet> </body> </html>

Intentamos ver la pgina con el navegador. Puesto que no est firmado, no funcionar. Si abrimos la consola de java (botn derecho del ratn sobre el applet y "abrir consola java"), veremos una excepcin de acceso denegado como esta

java.security.AccessControlException: access denied (java.io.FilePermission \ read) at java.security.AccessControlContext.checkPermission(Unknown Source) at java.security.AccessController.checkPermission(Unknown Source) at java.lang.SecurityManager.checkPermission(Unknown Source) at java.lang.SecurityManager.checkRead(Unknown Source) at java.io.File.list(Unknown Source)

at chuidiang.applet.AppletFirmado.rellenaListaConFicheroDeDirectorioRaiz(App letFirmado.java:30) at chuidiang.applet.AppletFirmado.init(AppletFirmado.java:24) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

Para que funcione, debemos firmar el applet. En JAVA_HOME/bin tenemos las aplicaciones keytool y jarsigner que nos permiten hacerlo. La primera, keytool, genera el certificado para el applet. La segunda, jarsigner, nos permite firmar el applet. Los pasos a seguir son:

Ejecutar keytool con algo como esto:

keytool -genkey -alias chuidiang -validity 120 -v


donde chuidiang es un alias para estas claves. La validez, segn hemos puesto, ser de 120 das. Nos har una serie de preguntas, datos que luego se pondrn en el certificado y el usuario podr ver.

Nos pregunta una clave para almacn de claves : Ponemos una clave que debemos recordar. Pregunta nombre y apellidos: Pongo por ejemplo "Chuidiang Roxas" Pregunta nombre del departamento de la empresa: Pues "chuidiang" mismo. Pregunta nombre de la empresa: tambin, cmo no, "chuidiang" Pregunta localidad: Alcala (sin acento por si acaso) Pregunta provincia: Madrid Pregunta cdigo del pais de dos letras: ES, de Espaa. Nos muestra lo que hemos metido y pregunta si es correcto, digo que s. Genera las claves y certificado autofirmado, adems intenta acceder a internet, me avisa el
cortafuegos y le dejo.

Pide contrasea clave y da opcin a pulsar intro si es la misma que la del almacn: Pulso intro Genera un fichero .keystore en c:\documents and settings\usuario\.keystore
Una vez que tenemos nuestro certificado, hay que firmar el jar. Para ello, arrancamos la aplcacin jarsigner

jarsigner.exe appletfirmado.jar chuidiang -verbose

Nos pide la clave del almacen de claves, la metemos. Como el otro, pide acceso a internet, avisa el cortafuegos, le doy permiso.
Al hacer esto intenta renombrar el appletfirmado.jar. Yo me he encontrado el problema de que si tengo firefox abierto e intent ver el applet, no me deja renombrar el appletfirmado.jar, a pesar de que firefox ya no estaba visualizando el applet. Para que todo me fuera bien, tuve que cerrar firefox. Una vez hecho esto, podemos ver la pgina con el navegador. El navegador mostrar un aviso diciendo que el certificado no ha podido ser comprobado y que si queremos ejecutar. El aviso del navegador es normal, puesto que el applet nos lo hemos firmado nosotros mismos y no somos una entidad reconocida para generar certificados dititales. Por ello, el navegador nos advierte que el applet est firmado, pero no por una autoridad adecuada. Si aceptamos el certificado, el applet funcionar correctamente y mostrar el listado de ficheros.

http://chuwiki.chuidiang.org/index.php?title=Firmar_Applets

Creando el jar desde netbeans Cuando creamos un proyecto netbeans, es muy comn generar el ejecutable jar desde ac mismo. Para generar un jar de una aplicacin sencilla solo le das: clic derecho sobre el proyecto -> Clean and Build La anterio opcin crea un directorio llamado dist en la caperta raz de tu proyecto. Quedando de la siguiente manera: /proyecto/dist /proyecto/src/ /proyecto/nbproject /proyecto/build Dentro del carpeta dist se encuentra el archivo jar del proyecto. Hasta ac no debera haber ningn problema con el jar ya generado. Mi proyecto necesita libreras para funcionar, cmo hago que funcione mi jar con estas libreras? Tienes un proyecto creado desde netbeans, en tu proyecto tienes agregado el conector de MySQL para conectar tu aplicacin con una base de datos de MySQL, has agregado la librera o conector haciendo clic derecho sobre libraries -> add libraries . Dentro de la carpeta delibraries de netbeans puedes ver que se agreg la librera exitosamente. Luego creo mi jar, lo ejecuto y no funciona!

Una razn por la cual sucede esto es porque de alguna forma, netbeans asigna los path de diferente forma a como los confirguro el proyecto. An as, mucha gente desconoce que netbeans en estos casos crea una estructura para evitar estos problemas Ya agregadas las libreras que vayas a ocupar en el proyecto vuelves a generar el jar, pero esta vez se va a crear una carpeta nueva, quedando la siguiente estructura: /proyecto/dist/ /proyecto/dist/lib/ Dentro de la carpeta dist se encuentra el jar recin generadoy dentro de la carpeta lib se encuentran todas las libreras que has agregado a tu proyecto. Es importante para el buen funcionamiento del jar que tambien muevas esta carpeta donde quieras poner el jar, por ejemplo, si mueves el jar otra pc hayq eu recordar que la estructura debe de quedar asi: /mi-archivo-jar.jar /lib/conectoX.jar /lib/conectorY.jar /lib/conectorZ.jar Nota: para ejecutar un jar desde consola se realiza de la siguiente manera: java -jar mi-archivo-jar.jar

http://www.apuntes.delibertad.com/netbeans/ejecutar-jar-creado-desde-netbeans/

Ejemplo sencillo de Applet


Un Applet no es ms que un programa java al que se referencia desde una pgina html y se ejecuta en el navegador. Dicho de otra forma, si visitamos con nuestro navegador esa pgina, veremos en ella ejecutarse el programa java, el Applet. Vamos a hacer aqu un pequeo ejemplo tonto, para ver cmo se hace un Applet.

Contenido
[ocultar]

1 Hacer el cdigo de nuestro Applet 2 Hacer la pgina de nuestro Applet 3 Situacin de la pgina html y del .class 4 El Applet y los jar 5 Restricciones en los Applet 6 Acceso a recursos 7 AppletViewer

Hacer el cdigo de nuestro Applet


En primer lugar, tenemos que hacer una clase Java que herede de JApplet. Esta clase ser la que tenga nuestro cdigo en java. Tenemos dos posibles mtodos que podemos sobreescribir de la clase padre: el mtodo init() y el mtodo start(). Al primero se le llamar una nica vez cuando nuestro applet se cargue en el navegador para ejecutarse. Al mtodostart() se le llamar cada vez que se revisite con el navegador la pgina que tiene nuestro Applet. A nosotros, de momento, nos bastar con el mtod init() del Applet. Puesto que un JApplet es un JComponent ms de java, podemos usarlo para aadir en l los componentes grficos de nuestra ventana: JLabel, JButton, JTextField, etc. Nosotros, como es un ejemplo simple, aadiremos nada ms un JLabel con el texto "Applet hola mundo". El cdigo de nuestro Applet puede quedar as

package com.chuidiang.ejemplos.applet; import javax.swing.JApplet; import javax.swing.JLabel; /** * Ejemplo sencillo de applet * @author Chuidiang

* */ public class EjemploApplet extends JApplet { /** * Pone un JLabel con el texto "Applet hola mundo" en el JApplet, de * forma que es lo que se visualizar en el navegador. */ public void init() { JLabel etiqueta = new JLabel("Applet hola mundo"); add(etiqueta); } }

El programa, por supuesto, debemos compilarlo y generar el .class

Hacer la pgina de nuestro Applet


Como hemos comentado, el Applet debe ser referenciado por una pgina html, que es la que se visualizar en el navegador. As que nos hacemos una pgina html. Para referencia elApplet, usamos el tag html <applet>. En este tag debemos indicar como mnimo el nombre de nuestra clase y el ancho y alto con el que queremos que se visualice nuestro Applet. La pgina html puede quedar como esta

<html> <head> <title>Ejemplo de Applet</title> </head> <body> <applet code="com.chuidiang.ejemplos.applet.EjemploApplet" width="500" height="200"> Debes tener instalado java </applet> </body> </html>

Situacin de la pgina html y del .class


Para que el navegador sea capaz de encontrar el .class del Applet a partir de la pgina html, debemos colocarlos juntos, en el mismo directorio. Sin embargo, tal cual indica java y al tener nuestro Applet un package en el cdigo, debemos hacer una estructura de directorios similar a la del package y meter el .class dentro. De esta forma, la pgina html y el .class del Appletdeberan estar ubicados as

+-- ejemplo-applet.html +-- com +-- chuidiang +--- ejemplos +---- applet +---- EjemploApplet.class

es decir, el directorio com en paralelo con el fichero ejemplo-applet.html y debajo de com toda la estructura chuidiang/ejemplos/applet/EjemploApplet.class En el tag <applet> de la pgina html hemos puesto en el atributo code el nombre de nuestra clase, con todos sus package delante. Listo. Visualizando en el navegador la pgina ejemplo-applet.html, deberamos ver el applet funcionando.

El Applet y los jar


Si nuestro Applet es ms complejo y requiere varias clases, lo normal es que hagamos un jar con todas esas clases. Tambin es posible, si nuestro Applet es lo suficientemente complejo, que incluso necesitemos otros jar de herramientas de terceros que usemos. Para indicar al navegador que debe cargar todos estos jar, tanto el nuestro como los de los dems, existe el atributo archive del tag <applet>. En este archive podemos poner todos los jar que necesitemos separados por comas.

<applet code="com.chuidiang.ejemplo.applet.EjemploApplet" archive="un.jar, otro.jar, mas.jar" ...

Eso s, todos estos jar deben estar subidos junto a nuestra pgina html.

Restricciones en los Applet


Un Applet es un programa que se ejecuta en el navegador del usuario que visita la pgina web, es decir, se ejecuta en SU ordenador. Por ello, sera mala idea dejar que un Applet pudiera hacer cualquier cosa. Yo podra hacer un Applet que borrara el disco duro y smplemente visitando la pgina donde yo lo ponga, se borrara el disco duro del visitante. Por ello, el navegador restringe severamente las cosas que un Applet puede hacer. Un Applet no puede acceder a NINGN recurso del ordenador donde se est ejecutando. No puede leer ni escribir en el disco duro, manejar la impresora, etc, etc, etc. Tampoco puede establecer conexiones de ningn tipo con otros ordenadores, con la nica excepcin del servidor web donde se alberga el Applet.

Si quieres que un Applet pueda hacer ms cosas, hay que firmarlo digitalmente. Al hacer esto, cuando se visualize el Applet en el navegador, este sacar un aviso al usuario, indicando que el Applet est firmado digitalmente por tal persona o entidad, y le pregunta al usuario si confa en dicha persona o entidad. Si el usuario dice que confa, el Applet tendr entonces los permisos para hacer lo que necesite. Si el usuario no confa, el Applet sigue igual de restringido que antes.

Acceso a recursos
Como hemos comentado, el Applet slo puede acceder a recursos que estn en el servidor web donde est alojado. Sin embargo, tampoco puede acceder a esos ficheros, iconos o lo que sea como si fueran ficheros normales, puesto que el disco duro del servidor no est directamente accesible. Cualquier acceso del Applet debe hacerse a travs del servidor web, usando el protocolo http. Para facilitar este acceso, la clase JApplet tiene mtodos que nos facilitan estos accesos al servidor web a travs de http. Algunos de estos mtodos son play() y getAudioClip() para acceso a ficheros de sonido, getImage() para acceso a imgenes, etc. Al ser a travs de servidor web, NO podemos escribir en el servidor. As que no podemos abrir un fichero del servidor y escribir en l. En cuanto a conexiones a base de datos, podemos acceder a una base de datos que est alojada en el mismo servidor web que nuestro Applet, pero NO podemos abrir conexiones con ningn otro sitio.

AppletViewer
Java viene con una aplicacin llamada appletviewer ubicada en el directorio bin de donde tenemos instalado java. Esta aplicacin sirve para arrancar y ver la pgina html del applet sin necesidad de abrir el navegador. Nos sirve como herramienta de pruebas mientras estamos desarrollando nuestro Applet.

appletviewer ejemplo-applet.html

http://chuwiki.chuidiang.org/index.php?title=Ejemplo_sencillo_de_Applet