Desarrollo Java

Javier Arenas

Software

 

Firma de Applets

Desarrollo Java.. 1

Introducción.. 1

La sandbox de Java.. 1

Autoridades de Certificación.. 1

Procedimiento de firma.. 1

Escribir applets privilegiadas para Microsoft Internet Explorer.. 1

Crear e instalar certificados de prueba para Microsoft Internet Explorer.. 2

Firmar Applets para Microsoft Internet Explorer.. 2

Escribir applets privilegiadas para Netscape Communicator.. 3

Crear e instalar certificados de pruebas para Netscape. 4

Firmar applets para Netscape. 5

 

Introducción

La firma de Software es cada vez más popular en Internet y aun mas la firma de applets desarrolladas en Java. En este documento veremos por que la firma de applets es importante, que ventajas nos aporta y describiremos procedimientos para firmar applets para los navegadores más populares, Netscape Communicator y Microsoft Internet Explorer.

 

La sandbox de Java

Todas las applets están restringidas a un “corral” en términos de seguridad. Es por esto que una applet no es un tipo normal de software. Todas las applets tienen restricciones en que pueden hacer, para evitar daños accidentales o maliciosos. Las applets no pueden por ejemplo acceder al disco duro cliente y no puede conectarse a ningún otro servidor mas que del que ha sido descargada. Hay mas restricciones pero estas son las mas importantes.

Sin embargo, a medida que las applets se empezaron a utilizar para desarrollar software mas complejo, se hizo evidente la necesidad de un método para evitar estas restricciones si el cliente confía en el autor de la applet.

Para ello se invento el procedimiento de firma de applets. Nuestra firma en un applet garantiza a otros que la applet es inofensiva. Evidentemente la firma no evita el daño, pero si se efectúa alguno se puede seguir la pista hasta el desarrollador de la applet.

 

Autoridades de Certificación

Desde luego no todas las firmas se corresponden con individuos o corporaciones reales. La unica forma de asegurar que una firma es autentica es que este respaldada por una Autoridad de Certificación reconocida, como VeriSign, Thawte, Entrust. Los navegadores admitirán los certificados de estas compañías automáticamente. Si el firmante no posee un certificado de confianza Microsoft Internet Explorer aconsejara no confiar en la applet (aunque aun sera posible aceptarla) y Netscape simplemente la ejecutara como una applet normal, dentro de la sandbox.

Sin embargo siempre podemos convertirnos en nuestra propia autoridad de certificación pero sera necesario que demos nuestro certificado base a nuestros clientes para que lo instalen primero en sus navegadores. Para ello bastara colocarlos en una pagina web.

 

Procedimiento de firma

Al firmar applets no firmamos en realidad nada en el código de la applet si no que firmamos el archivo comprimido que contiene todos los ficheros que nuestra applet necesita (clases, ficheros gráficos, ficheros html, etc). Hay dos métodos de compresión, el estándar JAR de SUN, admitido por Netscape y el formato CAB, usado por Microsoft.

Por esta razón necesitaremos dos procedimientos diferentes de firma, uno para Netscape y otro diferente para Microsoft Internet Explorer. A si mismo tendremos que generar dos archivos, un CAB y un JAR si queremos que el acceso a nuestra aplicación sea universal.

Cambiaremos pues el tag HTML que carga nuestra applet para hacerlo dual, es decir para que Microsoft Internet Explorer carge el archivo CAB y Netscape el JAR, de una forma trasparente para el cliente. El nuevo tag sera:

<applet code=”AppletPrivilegiada.class” ARCHIVE=”PrivilegiadaFirmada.jar” width=500 height=50><param name=”CABBASE” value=”PrivilegiadaFirmada.cab”></applet>

El parametro ARCHIVE sera pasado a Netscape y el parametro CABBASE a Microsoft Internet Explorer.

 

Escribir applets privilegiadas para Microsoft Internet Explorer

Normalmente no tendremos que cambiar el codigo de nuestra applet firmada para poder relizar operaciones “peligrosas” para que funcionen bajo Microsoft Internet Explorer. Sin embrago tendremos que usar las clases propietarias de Microsoft com.ms..security si nesitamos realizar operaciones peligrosas en 5 lugares:

 

Si intentamos realizar acceso a disco, por ejemplo, en uno de estos métodos Explorer levantara una excepción SecurityExceptionEx[Host].

Pero evitar este problema es fácil, si nuestra applet esta firmada podremos realizar operaciones restringidas en cualquier otro método o clase, o simplemente iniciaremos una nueva treta que realice estas operaciones.

 

Crear e instalar certificados de prueba para Microsoft Internet Explorer

Para crear un certificado de pruebas y mas tarde para firmar un applet que sea aceptada por Microsoft Internet Explorer necesitamos unas herramientas suministradas con el Microsoft Java-JDK.

Para crear el certificado nesitaremos makecert.exe y Cert2spc, para crear el fichero cab cabarc.exe y para firmarlo con el certificado signcode.exe.

 

Para crear el certificado seguiremos el siguiente procedimiento:

1.Crearemos un directorio por ejemplo c:\appfirm. Nos iremos a este directorio y ejecutaremos la siguiente instrucción (el MS Java JDK debe de estar ya en el path, si no es así podemos copiar los ficheros que necesitamos al directorio appfirm):

 

makecert /sv "ms_SAINCO.pvk" /n "CN=SAINCO Software" ms_SAINCO.cer

 

Donde:                  ms_SAINCO.pvk es el fichero de la llave privada.

                               ms_SAINCO.cer es el fichero con el certificado.

                               SAINCO Software es la organización que firmara el software

Nos preguntara dos veces por un password. Este password debe de ser el mismo y lo tendremos que utilizar para firmar el software.

 

2.Ahora generaremos un fichero .spc mediante el comando

Cert2spc ms_SAINCO.cer ms_SAINCO.spc

Firmar Applets para Microsoft Internet Explorer

Ahora crearemos un directorio con el nombre de nuestra applet en el directorio appfirm (o como lo hallamos llamado) el nombre que lleve este directorio sera el nombre que llevara nuestro archivo cab. En este directorio copiaremos nuestra applet y todas las clases y ficheros que nesesitemos incluso ficheros graficos y html, con su estructura de directorios apropiada.

Ahora, en el directorio appfirm crearemos el  archivo bat firmms.bat , haciendo los cambios apropiados:

 

@ECHO OFF

REM ****************************************************************************

REM Javier Arenas

REM Sainco Sevilla

REM Abril 2000

REM ****************************************************************************

REM Este fichero bat crea un archivo .cab firmado. El primer argumento

REM debe de ser el nombre del directorio apartir del cual crearemos el REM fichero cab (sin que termine en \).

REM El segundo argumento sera el nombre formal de la applet

REM El tercer argumento debe de ser low, medium o high (normalmente low).

 

REM Ahora definiremos algunas variables. Sus valores deben cambiarse

REM por los adecuados You'll need to

 

REM Esta es la ruta al fichero .spc

SET CERT_FILE="c:\appfirm\ms_SAINCO.spc"

 

REM Esta es la ruta al fichero .pvk

SET KEY_FILE="c:\appfirm\ms_SAINCO.pvk"

 

REM Ahora crearemos el fichero .cab. Los argumentos son:

REM    -r        Recurrir en los directorios

REM    -p        Conservar las rutas de los ficheros

REM    -P [arg]  Poner el argumento (aqui "%1\") en el comienzo de cada ruta

REM    N  [arg]  Crear el fichero .cab especificado

REM    [rest]    Poner los fichero (aqui "%1\*.*") en el fichero .cab

ECHO *********** Creando el fichero.cab usando cabarc ***********

cabarc -r -p -P %1\ N %1.cab %1\*.*

 

REM Ahora firmaremos el codigo. Los argumentos son:

REM    -j javasign.dll    Herramientas

REM    -jp  [arg]         El nivel de permisos a usar

REM    -spc [arg]         Archivo .spc

REM    -v   [arg]         Archivo de llave privada

REM    -n   [arg]         Nombre de la applet (mostardo en la ventana del cetificado)

REM    [arg]              Archivo a firmar (aqui "%1.cab")

ECHO *********** Firmando el codigo usando signcode ***********

signcode -j javasign.dll -jp %3 -spc %CERT_FILE% -v %KEY_FILE% -n %2 %1.cab

 

 

REM Liberamos variables de entorno

SET CERT_FILE=

SET KEY_FILE=

 

ECHO *********** Archivo .cab firmado ***********

Ahora solo tendremos que ejecutar por ejemplo firmms miapplet MiApplet low y obtendremos un fichero.cab firmado

 

Escribir applets privilegiadas para Netscape Communicator

Desde la versión 4 de Netscape Navigator firmar una applet no es suficiente para que esta sea autorizada a realizar operaciones privilegiadas. El privilegio debe de ser pedido al usuario y este debe concederlo. Lo hacemos llamando metodos en el paquete netscape.security. Estos metodos estan incluidos en la Netscape´s Capabilities API.

En un caso tipico, en que una applet desese conectarse a un servidor diferente del que ha sido descargada, primero tendremos que obtener esta capacidad llamando a :

PrivilegeManager.enablePrivilege("UniversalConnect")

Incluyo un ejemplo del uso de esta API

 

// To compile, add java40.jar to the class path. 

import netscape.security.PrivilegeManager;

 

public class WriteFile extends Applet {

 

    public void paint(Graphics g) {

 

        String slash = System.getProperty("file.separator");

 

        try {

            // Support added for Netscape's Capabilities API. 

            if (SecurityContext.isCapableOf("UniversalFileAccess")) {

                PrivilegeManager.enablePrivilege("UniversalFileAccess");

            }

 

            String userdir = System.getProperty("user.dir");

            g.drawString("Successfully read user.dir ..." + userdir, 10, 10);

 

            String fileName = userdir + slash + "tmpfoo";

 

            DataOutputStream dos;

            dos = new DataOutputStream(new FileOutputStream(fileName));

            dos.writeChars("This was written by a trusted applet.\n");

            dos.close();

            g.drawString("Successfully wrote to file " + fileName, 10, 30);

        }

 

        catch (Exception e) {

            g.drawString("WriteFile: caught " + e, 10, 10);

        }

    }

}

 

Esta applet llama al metodo isCapableOf en SecurityContext para decidir si intentar o no obtener privilegios del manager de seguridad de Netscape. Aquí esta el codigo para este metodo:

 

private static Hashtable hash = new Hashtable();

 

    public static synchronized boolean isCapableOf(String s) {

 

        if (!isCommunicator()) return false;

 

        Boolean granted = (Boolean) hash.get(s);

 

        if (granted == null) {

            granted = Boolean.FALSE;

            try {

                // Ask for the capability. 

                PrivilegeManager.enablePrivilege(s);

                granted = Boolean.TRUE;

            }

            catch (Exception e) {

                // Capability not granted. 

            }

            hash.put(s, granted);

        }

 

        return granted.booleanValue();

   

El método isCommunicator nos permite saber si el manager de seguridad de Netscape esta presente. Este es el código de este método:

 

private static Boolean communicator;

 

    public static synchronized boolean isCommunicator() {

 

        if (communicator == null) {

            communicator = Boolean.FALSE;

            try {

                // Try to find one of the netscape.security classes. 

                Class t = Class.forName("netscape.security.UserDialogHelper");

                communicator = Boolean.TRUE;

            }

            catch (Exception e) {

                // Can't find netscape.security package.

            }

        }

 

        return communicator.booleanValue();

    }

 

El fichero java40.jar es necesario para la compilación de este programa. Este fichero se incluye en la instalación de Netscape 4.0

 

Crear e instalar certificados de pruebas para Netscape

Crear un Certificado

Para firmar una applet que sera usada por Netscape Navigator tendremos que usar Netscape Object Signing tool, que se puede bajar en http://developer.netscape.com/software/signedobj/jarpack.html. Esta herramienta puede creer tambien certificados de prueba. Las applets firmadas con estos certificados podran ser usados solos por navegadores “conocidos”, es decir, en cullos navegadores se halla instalado el certificado.

Para crear un certificado tendremos que creear un directorio (e.j. c:\appfirm) donde instalaremos signtool.exe, entonces crearemos un subdirectorio de este primero (e.j. micert).Ahora tendremos el arbol c:\appfirm\micert\.

Copiese en el directorio micert los dos ficheros que contienen la informacion de certificados en Netscape, llamados cert7.db y key3.db, que se encuentran en  c:\Archivos de Programa\Netscape\Users\<Usuario>.

Abrase una ventana DOS y vayase al directorio c:\appfirm , ya podemos crear nuestro certificado  (e,j. Sainco) con el siguiente comando:

signtool -G"Sainco" -d"micert"

...donde  lo que sigue a  -G especifica el nombre de tu certificado y -d el directorio que contiene los ficheros.db.

signtool Pedira la siguiente informacion:

·         Certificate common name: Sainco Autoridad de Certificacion

·         Organization: Sainco

·         Organization Unit: Desarrollo de Software

·         State/Province: Sevilla

·         Country: ES

·         Username: jacksand

·         Email address: [email protected]

Tras esto se producira un fichero en  c:\appfirm llamado x509.cacert; Este es nuestro certificado.

Importar el Certificado

Ahora tenemos que importar el certificado en Netscape, para que el navegador acepte applets firmadas con este certificado. Para ello crearemos primero un documento html en appfirm que contenga la siguiente linea:

<a href="x509.cacert">Pincha aqui para importar el certificado</a>

Para que esto funcione  Navigator tiene que tener el MIME type application/x-x509-ca-cert (Mira en Preferences, en el panel Navigator/Applications que se acepcede desde Edit/Preferences). Si no lo tiene, lo crearemos con la siguiente informacion:

·         Description of type: x509 CA certificate

·         File extension: cacert

·         MIME type: application/x-x509-ca-cert

·         Application to use: C:\WINNT\system32\rundll32.exe c:\winnt\system32\inetcpl.cpl,SiteCert_RunFromCmdLine %1

Ahora abriremos el documento html con Communicator y haremos click en Pincha aqui para importar el certificado . Netscape te guira ahora por una serie de ventanas. Si no lo hace, tendremos que salir de Netscape y borrar el cache  Ya hemos importado el certificado. Ahora tendremos que firmar la applet.

 

Firmar applets para Netscape

 

Crearemos un directorio en appfirm llamado por e.j miapplet donde copiaremos todos los ficheros de classes que nesesita nuestra applet, incluso librerias.

Ahora nos aseguraremos de que el certificado esta preparado para ser firmado. Para ello ejecutaremos:

signtool -d"c:\appfirm\micert" -L

signtool una lista con todos los certificados. El nuestro se llamara Sainco, y tendra un "*" a su izquierda (indicando que se puede usar para firmar). Yo tuve el siguiente resultado

using certificate directory: c:\program files\netscape\users\default

S Certificates

- ------------

  AT&T Certificate Services

  Thawte Personal Premium CA

  GTE CyberTrust Secure Server CA

  Verisign/RSA Commercial CA

  AT&T Directory Services

  GTIS/PWGSC, Canada Gov. Web CA

  Thawte Personal Freemail CA

  Thawte Server CA

  GTIS/PWGSC, Canada Gov. Secure CA

  MCI Mall CA

  VeriSign Class 4 Primary CA

  United States Postal Service CA

  KEYWITNESS, Canada CA

  Netscape Export Control Policy CA

  BBN Certificate Services CA Root 1

  Thawte Personal Basic CA

  CertiSign BR

  VeriSign Class 3 Primary CA

  Canada Post Corporation CA

  Integrion CA

  IBM World Registry CA

  Uptime Group Plc. Class 1 CA

  VeriSign Class 1 Primary CA

  VeriSign Class 2 Primary CA

  VeriSign, Inc. - VeriSign, Inc.

  Uptime Group Plc. Class 2 CA

  Thawte Premium Server CA

  Uptime Group Plc. Class 3 CA

  Verisign/RSA Secure Server CA

  GTE CyberTrust Root CA

  Uptime Group Plc. Class 4 CA

* Sainco

------------

Por lo tanto nuestro certificado se puede usar para firmar.

 

Ahora crearemos un archivo .bat al que llamaremos firmar.bat con el siguiente contenido. Atencion, habra que cambiar algunas variables, entre ellas la principal, el password para la base de datos de Netscape

 

@ECHO OFF

REM Javier Arenas Marzo 2000

REM SAINCO. Manchester (Reino Unido).

REM Script para comvertir un directorio en un archivo jar firmado. Toma el nombre del directorio

REM como argumento; crea un archivo .jar del mismo nombre en el directorio anterior a este.

REM Nota: Tiene que ser ejecutado en un directorio superior al que va ha ser firmado.

 

REM Voy a definir un par de variables para hacer el scrip leible. Tendras que

REM editar estas variables para hacer que concuerden con tu configuracion. Si obtienes algo asi como

REM "Out of environment space" tendras que fastidiarte y incrementar el espacio de memoria a DOS.

REM (!Como me gusta DOS!.)

 

REM esto es la locaclizacion de la base de datos de certificados de NS.

SET ID_LOC="f:\firmas\micertificado"

 

REM Este es el nombre de la autoridad de certificacion

SET ID_NAME="Sainco"

 

REM Este es el password para la base de datos de NS. Adivina cual es

SET ID_PASSWD="jacksand"

 

REM Este es el nivel de compresion para el archivo .jar. 0 es no compresion

REM 9 es maxima compresion. 

SET COMPRESSION=9

 

ECHO *********** Firmando el JAR ***********

signtool -d%ID_LOC% -k%ID_NAME% -p%ID_PASSWD% -Z %1.jar -c%COMPRESSION% .\%1

 

REM nos deshacemos de las variables

SET ID_LOC=

SET ID_NAME=

SET ID_PASSWD=

SET COMPRESSION=

 

ECHO *********** Archivo JAR creado ***********

ECHO ----------- SAINCO. MANCHESTER 2000 ---------------

 

Ahora solo tendremos que ejecutar firmar miapplet. Se creara un fichero .jar llamado miapplet.jar firmado y preparado.