| Artículos | 01 JUL 2007

Cómo firmar código: applets de Java

Tags: Histórico
Cómo firmar código para su distribución por Internet
Gonzalo Álvarez.
Cuando se distribuye código a través de internet, al estilo de controles ActiveX o Applets de Java, el navegador introduce una serie de restricciones para impedir que se ejecute indiscriminadamente y pueda causar destrozos en el equipo de la víctima. Ahora bien, si se desea poder realizar ciertas acciones privilegiadas, como acceder al disco para leer o escribir, realizar conexiones a través de internet o acceder a ciertas propiedades del sistema, entonces se hace imprescindible firmar el código. En este artículo se explica cómo.

Como consecuencia de las estrictas restricciones impuestas por el modelo de seguridad de Java, muchos desarrolladores de software se encuentran ante la impotencia de escribir aplicaciones realmente útiles. El gestor de seguridad de Java les niega la capacidad de leer/escribir en disco o de abrir conexiones a otras máquinas, operaciones fundamentales si se quieren realizar tareas tan elementales como, por ejemplo, guardar en disco los datos creados mediante la aplicación. Por consiguiente, si se quiere que los applets sean algo más que dibujos animados para realzar el impacto visual de una página y lleguen a convertirse en verdaderas aplicaciones productivas y eficaces, los usuarios de la aplicación Java necesitan garantizarle el acceso a sus recursos. Ahora bien, antes de concederle estos privilegios, necesitan de un mecanismo que les permita saber de dónde (o de quién) proviene el applet al que le van a permitir acceso a su sistema. Es en este momento crucial donde la firma digital de software viene a solucionar este problema de confianza. Se explicará a continuación la forma práctica de firmar applets, para que se puedan ejecutar sin restricciones en el sistema del usuario, siempre y cuando éste confíe en el autor que firma el applet. En la próxima entrega se explicará cómo firmar aplicaciones de .NET. En futuras entregas se explicarán los dominios de seguridad y los modelos de seguridad basada en la identidad del código, tanto en Java como en .NET.

Firma de código en Java
A diferencia de .NET, que utiliza los almacenes de certificados predeterminados de la plataforma Windows, en el caso de Java, y debido a la vocación de portabilidad, los certificados se guardan en unos almacenes de claves especializados, denominados keystores. El almacén de claves no es más que un archivo binario que puede contener uno o más certificados digitales, con o sin la clave privada asociada. Existen distintos formatos para este archivo, aunque el más popular es el proporcionado por defecto por Sun, llamado JKS. Cada clave almacenada puede protegerse por una contraseña independiente y posteriormente puede protegerse la integridad de todo el almacén con otra contraseña. No obstante, podrían utilizarse diferentes implementaciones de estos almacenes suministradas por diferentes proveedores de servicios. El JDK proporciona una herramienta para trabajar con los almacenes de tipo JKS, llamada keytool, ubicada en el directorio bin de la instalación del JDK. La documentación de esta herramienta está accesible en java.sun.com/j2se/1.5.0/docs/tooldocs/windows/keytool.html.
Por otro lado, además de los diversos almacenes de claves que pueda crear el usuario, existe un almacén de claves preinstalado con el JRE en el directorio {java.home}\lib\security llamado cacerts y protegido con la contraseña “changeit”, que contiene los certificados de las autoridades raíz de confianza. Si se está trabajando con una autoridad que no aparece listada en dicho archivo, habrá que añadir su certificado mediante la herramienta keytool como se verá más tarde.
A continuación se realizará un ejemplo completo de firma de código de un applet que intenta acceder al disco duro de la máquina del cliente para crear un archivo de texto:
import java.applet.*;
import java.awt.Graphics;
import java.io.*;
import java.lang.System.*;

public class EscribeArchivo extends Applet {
String miArchivo=»c:\\Gonzalo\\temp.txt»;

public void paint(Graphics g) {
String param;
param = getParameter( «nombreArchivo» );
if ( param != null ) {
miArchivo = param;
};
try {
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(miArchivo),128));
dos.writeBytes(“Lejos del mundanal ruido.”);
dos.flush();
dos.close();
g.drawString(“Se ha creado el archivo “ + miArchivo, 10, 10);
} catch (SecurityException se) {
g.drawString(“EscribeArchivo: excepción de seguridad”, 10, 10);
System.out.println( se.getMessage( ) );
} catch (IOException ioe) {
g.drawString(“EscribeArchivo: excepción de E/S”, 10, 10);
System.out.println( ioe.getMessage( ) );
}
}
}
Para ilustrar todo el proceso de firma se van a realizar los siguientes cuatro pasos: en primer lugar, se generará un certificado digital de usuario. En segundo lugar, se empaquetará el código a firmar. En tercer lugar, se firmará el código del ejecutable utilizando el certificado. En cuarto y último lugar, se procederá al despliegue del applet.

Generación de certificado autofirmado
Se puede crear un certificado autofirmado mediante el comando -genkey. Este comando crea una pareja de claves pública y privada para los algoritmos y longitudes especificados. A partir de los datos personales introducidos por el usuario y de la clave pública, keytool crea un certificado autofirmado, que posteriormente puede ser enviado a una autoridad de certificación para su firma. El comando -genkey acepta las siguientes opciones:
-alias: un nombre arbitrario elegido por el usuario que identifica unívocamente cada entrada del almacén de claves.
-sigalg, -keyalg, -keysize, -keypass: el algoritmo de firma, el algoritmo de clave pública, la longitud de la clave pública y la contraseña que protege la clave privada, respectivamente. El algoritmo de cifrado predeterminado es “DSA” con 1.024 bits y para firma “SHA1withDSA”, aunque puede elegirse “RSA” con algoritmo de firma “MD5withRSA”. Si no se especifica una contraseña para cada clave privada, puede utilizarse la del almacén para protegerlas a todas.
-validity: el número de días que será válido el certificado.
-keystore, -storepass: el nombre y ubicación del almacén de claves, junto con la contraseña que lo protegerá. Si no se especifica la primera opción, el almacén de claves se creará en el directorio personal del usuario con el nombre .keystore. Si no se especifica la segunda opción, keytool solicitará la contraseña.
A continuación se ejecuta un ejemplo de creación de certificado. Es importante añadir el directorio bin del JDK a la variable de entorno de sistema PATH para que encuentre el ejecutable.
keytool -genkey -alias gonzalo -keystore gonzalo.jks
Escriba la contraseña del almacén de claves:
+Cuáles son su nombre y su apellido?
[Unknown]: Gonzalo Alvarez
+Cuál es el nombre de su unidad de organización?
[Unknown]: TIC
+Cuál es el nombre de su organización?
[Unknown]: CSIC
+Cuál es el nombre de su ciudad o localidad?
[Unknown]: Madrid
+Cuál es el nombre de su estado o provincia?
[Unknown]: Madrid
+Cuál es el código de país de dos letras de la unidad?
[Unknown]: ES
+Es correcto CN=Gonzalo Al

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información