|
|
Desarrollo
Java
|
Javier Arenas Software |
Firma de
Applets
Desarrollo Java
Escribir applets privilegiadas para
Microsoft Internet Explorer
Crear e instalar certificados de prueba
para Microsoft Internet Explorer
Firmar Applets para Microsoft Internet Explorer
Escribir applets privilegiadas para
Netscape Communicator
Crear e instalar certificados de pruebas
para Netscape
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.
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.
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.
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.
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.
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
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
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 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.
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.