Firmar Applets

De ChuWiki

Por qué los applet no tienen permiso[editar]

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 dónde viene.

El motivo de esto es sencillo. Yo podría hacer y poner en esta página un Applet que borre el disco duro del que navega y vea esta página. Sólo por visualizar esta página, se borraría 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 más o menos dice esto

Este Applet está firmado por Fulanito de los Palotes.
Pulse "Aceptar" sólo si confía 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 demás.

Ejemplo de cómo firmar un Applet[editar]

El código para nuestro Applet puede ser algo sencillo, por ejemplo, sacar una lista con los ficheros en el directorio raíz del usuario que ve nuestro applet.

package chuidiang.applet;

import java.io.File;

import javax.swing.DefaultListModel;
import javax.swing.JApplet;
import javax.swing.JList;
import 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 cómo se hace un jar en cómo generar un jar. Al jar podemos llamarle, por ejemplo appletfirmado.jar, aunque todavía no esté firmado.

Creamos una página html de prueba para nuestro applet, después de haber generado el jar. La página 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 página con el navegador. Puesto que no está firmado, no funcionará. Si abrimos la consola de java (botón derecho del ratón sobre el applet y "abrir consola java"), veremos una excepción 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(AppletFirmado.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, según hemos puesto, será de 120 días.

Nos hará una serie de preguntas, datos que luego se pondrán en el certificado y el usuario podrá ver.

  • Nos pregunta una clave para almacén 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: también, cómo no, "chuidiang"
  • Pregunta localidad: Alcala (sin acento por si acaso)
  • Pregunta provincia: Madrid
  • Pregunta código del pais de dos letras: ES, de España.
  • Nos muestra lo que hemos metido y pregunta si es correcto, digo que sí.
  • Genera las claves y certificado autofirmado, además intenta acceder a internet, me avisa el cortafuegos y le dejo.
  • Pide contraseña clave y da opción a pulsar intro si es la misma que la del almacén: 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 aplcación 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 página 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.