Seguridad en Java 

Qué es Java 

Barreras de seguridad 

Prohibido 

Agujeros 

Líneas futuras 

Consejos 

Recursos 

Seguridad en Java

Cómo firmar applets para Netscape

Pasos generales 

Internet Explorer 

Netscape 

Inconvenientes 

Comparación 

Lo primero que se necesita es hacerse con las herramientas necesarias. En primer lugar, hay que notar que para poder firmar un applet que va a acceder a recursos restringidos, como el sistema de ficheros, propiedades del sistema o conexiones de red, se necesita alterar el código fuente del applet, incluyendo llamadas a ciertas funciones para garantizar los privilegios requeridos. Estas clases constituyen lo que se denomina el Netscape Java Capabilities API. Por otro lado, se requiere la herramienta de firmado, conocida como SignTool 1.1. Una vez armados con este arsenal, se puede proceder ya a firmar applets, siguiendo los siguientes pasos.

Paso 1: Crear un certificado para firmar applets

El primer paso consiste también en adquirir un certificado adecuado de una autoridad de certificación. Hay que asegurarse de que la autoridad elegida emite certificados que permitan firmar software, los de clase 2 para uso personal y los de clase 3 para aplicaciones comerciales. VeriSign puede ser de nuevo la elección adecuada. Se pueden consultar más autoridades propuestas por Netscape, aptas para certificar sus productos.

En este caso, y como sólo se necesita para hacer pruebas, se creará un certificado de prueba, que es gratis, utilizando la citada herramienta SignTool 1.1.

Antes de instalar claves y certificados nuevos en las bases de datos de Netscape Communicator, es imprescindible crear una contraseña para acceder a la base de datos. Para hacerlo, se pulsa el botón de Seguridad en la barra de herramientas de Communicator, se elige Passwords y después se pulsa el botón de Establecer Passwords para crearlo.

Otro aviso importante es que para ejecutar SignTool se debe cerrar antes todas las ventanas abiertas de Communicator, ya que en caso contrario se corre el riesgo de corromper las bases de datos de claves y certificados.

Para generar un certificado de prueba se utiliza la opción -G seguida de un nombre y la opción -d para indicar el directorio donde se encuentra la base de datos de certificados (el fichero cert7.db) y claves (el fichero key3.db) de Communicator. Por ejemplo, para crear un certificado para Gonzalo del CSIC, se puede escribir lo siguiente (en negrita aparece lo que se debe introducir en la línea de comandos):

signtool -G gonzalo -d c:\netscape\users\gonzalo
using certificate directory: c:\netscape\users\gonzalo
Enter certificate information. All fields are optional. Acceptable
characters are numbers, letters, spaces, and apostrophes.
certificate common name: Certificado para pruebas
organization: CSIC
organization unit: TIC
state or province: Madrid
country (must be exactly 2 characters): ES
username: gonzalo
email address: gonzalo@iec.csic.es
Enter Password or Pin for "Communicator Certificate DB": [no se produce eco]
generated public/private key pair
certificate request generated
certificate has been signed
certificate "gonzalo" added to database
Exported certificate to x509.raw and x509.cacert.

Si en el paso anterior se especificó la opción -d junto con el camino donde se encuentra la base de datos de claves y de certificados de Communicator, la base ya ha quedado automáticamente actualizada. La próxima vez que se arranque Communicator, si se pulsa el botón de Seguridad de la barra de herramientas, en Certificados y a continuación en Propios se comprobará que aparece el recién creado.

Se puede comprobar que el certificado se ha instalado correctamente también mediante signtool, con la opción -l:

signtool -l
using certificate directory: .
Object signing certificates
---------------------------------------
gonzalo
Issued by: gonzalo (Certificado para pruebas)
Expires: Sun Apr 11, 1999
---------------------------------------
For a list including CA's, use "signtool -L"

Con este certificado ya se está listo para firmar applets. Ahora bien, no basta con firmarlos. Para que los usuarios puedan ejecutar applets firmados es necesario que instalen en su versión de Communicator el certificado que se acaba de generar. Si se hace un listado del directorio donde se está trabajando, se observará que signtool ha creado dos ficheros automáticamente, x509.cacert y x509.raw. El primero de ellos contiene el certificado en formato base64. Para que quede a disposición de cualquiera que lo necesite, se seguirán los siguientes pasos:

  • Crear un enlace al fichero x509.cacert en una página Web
    Por ejemplo, puede añadir la siguiente línea en HTML a su página personal para que los visitantes que deseen ejecutar sus applets sepan dónde obtener su certificado:
    Primero debes instalar mi <a href="x509.cacert">certificado</a>.
  • Asegurarse de que el servidor Web exporta el fichero como MIME-type application/x-x509-ca-cert
    Los servidores de Netscape están configurados así por defecto y también algunos servidores Unix. No así el Internet Information Server de NT, por lo que habrá que configurarlo para que asocie ese tipo MIME a la extensión .cacert.
  • Instalar el certificado
    Una vez que esos pasos han sido seguidos, basta con pinchar en el enlace anterior para que automáticamente se lance el proceso de instalación de certificados de Netscape. Siguiendo las instrucciones del proceso, muy sencillo, se instalará el certificado en el navegador del usuario, que podrá a partir de ahora ejecutar correctamente todos los applets firmados con este certificado.

Paso 2: Crear un applet con privilegios

Antes de traspasar los límites del recinto de seguridad, los applets tienen que pedir permiso educadamente. La manera como se consigue es mediante el API de capacidades. Cada vez que un applet quiere efectuar alguna acción restringida, debe pedir permiso al navegador para ver si éste se lo concede, para lo cual se sirve de las funciones contenidas en esta API. Cuando el applet le pide permiso al navegador, éste busca en su base de datos si existe una entrada para el firmante del applet y si la acción le está permitida. Caso de no existir ninguna entrada, el navegador presenta una ventana pidiendo confirmación antes de conceder el permiso. El usuario decide si garantiza o deniega el permiso, con la posibilidad de almacenar la decisión en la base de datos para futuras referencias.

La forma de modificar el applet consiste en preceder todas las llamadas a recursos protegidos de una llamada al gestor de privilegios.

Por ejemplo, para solicitar privilegios antes de leer propiedades del sistema, la función en Java que lee los privilegios irá precedida de:

PrivilegedManager.enablePrivilege("UniversalPropertyRead");

Para leer/crear/escribir ficheros, se precedería el bloque de funciones correspondiente por:

PrivilegedManager.enablePrivilege("UniversalFileAccess");

Y así con distintas llamadas para cada tipo de recurso. Una vez terminadas las operaciones que requieren privilegios, constituye una buena práctica revocar los privilegios concedidos, utilizando la siguiente función:

PrivilegeManager.revertPrivilege("UniversalPropertyRead");

Puedes consultar el listado completo de los recursos que se pueden acceder. La documentación completa sobre este API donde se detalla su funcionamiento se puede obtener gratuitamente.

El mayor inconveniente de este enfoque es que exige la modificación del applet y además, como consecuencia de los cambios introducidos, no funcionará ya en ningún otro navegador, tirando por tierra la filosofía de Java de "Escribir una vez, ejecutar en cualquier sitio".

Paso 3: Firmar y empaquetar los ficheros con las clases

En vez de firmar el fichero con todas las clases compactadas, como se hacía en el caso de IE, primero se crea un directorio al que se copian todas las clases que componen el applet y a continuación se firma el directorio utilizando la herramienta SignTool. La propia herramienta se encarga de generar un fichero comprimido con todas las clases y demás ficheros que se hayan copiado en el directorio. Este fichero recibe el nombre de Archivo Java (JAR). En versiones anteriores esta herramienta se llamaba zigbert, pero con la versión actual de SignTool ha quedado obsoleta.

En el caso supuesto de que se quiera firmar la clase abednego.class, se copiará a un directorio al que se llamará abednego y se ejecutará el programa SignTool, pasándole la clave del certificado almacenada en la base de datos de Communicator, que se acaba de generar en el paso 1. Por ejemplo:

signtool -k gonzalo -Z abednego.jar abednego
using certificate directory: .
Generating abednego/META-INF/manifest.mf file..
--> abednego.class
adding abednego/gon.txt to abednego.jar...(deflated 0%)
Generating zigbert.sf file..

Aquí pide el password:

Enter Password or Pin for "Communicator Certificate DB": [no se produce eco]

Si se ha introducido correctamente, continúa:

adding abednego/META-INF/manifest.mf to abednego.jar...(deflated 14%)
adding abednego/META-INF/zigbert.sf to abednego.jar...(deflated 27%)
adding abednego/META-INF/zigbert.rsa to abednego.jar...(deflated 43%)
tree "abednego" signed successfully

Ahora ya está disponible el fichero abednego.jar para distribuirlo con su firma incorporada. Se puede verificar que el proceso se ha realizado correctamente utilizando la opción -v:

signtool -v abednego.jar
using certificate directory: .
archive "abednego.jar" has passed crypto verification.

status path
------------ -------------------
verified abednego.class

Paso 4: Incrustar el JAR en la página web

En este caso la etiqueta <applet> también cambia ligeramente para permitir la inserción del archivo JAR:

<applet
code=abednego.class
archive=abednego.jar
width=320
height=200>
</applet>

Es importante eliminar el fichero abednego.class original del directorio, ya que en caso contrario el navegador lo cargaría, en lugar del firmado. Ahora ya se puede visualizar correctamente el applet en Communicator. En cada ocasión en la que el applet necesite acceder a un recurso protegido, al usuario se le presentará una ventana de advertencia, en la que se le informa de los permisos que está solicitando ese applet, acompañados de una estimación del riesgo potencial derivado de su concesión. Siempre y cuando no se active la casilla para recordar la decisión, esta ventana aparecerá cada vez que el applet intente acceder de nuevo a ese recurso. En la figura se muestra la información del certificado que el usuario puede comprobar pulsando el botón Certificado en la ventana anterior. Obsérvese cómo los datos corresponden a los que se introdujeron en el paso 1.

Ejemplos de applets para Netscape Communicator

Puedes ver un ejemplo operativo con su código fuente disponible en:

  • Renegado: esta applet gozará de los privilegios necesarios para acceder a las propiedades del sistema y al disco.

 

Copyright © 1997-1999 Gonzalo Álvarez Marañón, CSIC. Todos los derechos reservados.

Criptonomicón es un servicio ofrecido libremente desde el Instituto de Física Aplicada del CSIC. Para información sobre privacidad, por favor consulte la declaración de política sobre privacidad. Para sugerencias, comentarios o quejas, acuda al libro de visitas. Para contribuir al Criptonomicón, lea la página de contribuciones.