¿Cómo firmar un Java Applet?

En este artículo explicaremos como firmar un applet con un certificado propio o uno CA. Para el desarrollo se emplea las herramientas disponibles en el Kit de Desarrollo jdk1.6.0_04. Llamaremos %JPATH% al directorio donde se encuentran los ejecutables del JDK, por ejemplo “C:\Archivos de programa\Java\jdk1.6.0_04\bin”.
En Netbeans he modificado una aplicación que usa librerías que implementan el protocolo IAX2 y el resultado final es un softphone desplegable en una simple página html.

Agregar la ruta de los binarios de Java a la variable de entorno PATH

Para poder trabajar con los ejecutables del JDK desde cualquier directorio agregaremos la ruta %JPATH% a la variable de entorno PATH. Seleccionamos Propiedades dentro del Menu contextual sobre Mi PC. Bajo la pestaña de Opciones avanzadas hacemos click sobre el botón Variables de entorno. Buscamos y hacemos click sobre Path entre las Variables de sistema, luego hacemos click sobre el botón Modificar y en el Valor de la variable agregamos al final un punto y coma (”;“) seguido de %JPATH%.

Creación de la llave

Usaremos el algoritmo RSA y el alias cg1key.
C:\>keytool -genkey -keyalg rsa -alias cg1key
Escriba la contraseña del almacén de claves: ********
¿Cuál es son su nombre y su apellido?
[Unknown]: Franco Cedillo
¿Cuál es el nombre de su unidad de organización?
[Unknown]: IT
¿Cuál es el nombre de su organización?
[Unknown]: CyberGod
¿Cuál es el nombre de su ciudad o localidad?
[Unknown]: Lima
¿Cuál es el nombre de su estado o provincia?
[Unknown]: Lima
¿Cuál es el código de país de dos letras de la unidad?
[Unknown]: PE
¿Es correcto CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE?
[no]: si
Escriba la contraseña clave para <cg1key>
(INTRO si es la misma contraseña que la del almacén de claves): ENTER
Exportación de la llave
C:\>keytool -export -alias cg1key -file cg1key.crt
Escriba la contraseña del almacén de claves:
Certificado almacenado en el archivo <cg1key.crt>

Compilación de Applet

Basta con colocarse en el directorio build dentro de la ruta de nuestro projecto. Allí debemos ubicar las bibliotecas JAR empleadas y un archivo con el texto que requerimos en el manifiesto. El manifiesto es un archivo de texto que puede tener la siguiente estructura:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.0
Created-By: 10.0-b19 (Sun Microsystems Inc.)
X-COMMENT: Main-Class will be added automatically by build
Class-Path: inifile.jar jiaxc_windows_x86.jar jiaxc_windows_x86_md5.jar jiaxclient.jar libjiaxc.jar swing-layout-1.0.jar
Para este ejemplo he llamado mymanifest al archivo de texto que será agregado como manifiesto al archivo JAR que generaré. En la línea de comando ejecutamos:
…\build>jar cvfm jiaxTest.jar mymanifest -C classes .
manifest agregado
agregando: Click2Call.gif (entrada = 6574) (salida = 6537) (desinflado 0%)
agregando: IaxTestApplet.class (entrada = 3062) (salida = 1507) (desinflado 50%)
agregando: PhonePanel$1.class (entrada = 1193) (salida = 652) (desinflado 45%)
agregando: PhonePanel$2.class (entrada = 766) (salida = 471) (desinflado 38%)
agregando: PhonePanel$3.class (entrada = 698) (salida = 426) (desinflado 38%)
agregando: PhonePanel$4.class (entrada = 698) (salida = 429) (desinflado 38%)
agregando: PhonePanel$Listener.class (entrada = 4416) (salida = 1957) (desinflad
o 55%)
agregando: PhonePanel.class (entrada = 14948) (salida = 6090) (desinflado 59%)

Firma de bibliotecas JARs necesarias

…\build>jarsigner inifile.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner jiaxc_windows_x86.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner jiaxc_windows_x86_md5.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner jiaxclient.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner libjiaxc.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner swing-layout-1.0.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.
…\build>jarsigner jiaxTest.jar cg1key
Enter Passphrase for keystore: *******
Warning:
The signer certificate will expire within six months.

Verificación de Firma o Signado

Verificaremos uno de todos los JARs que hemos signado.
…\build>jarsigner -verify -verbose -certs jiaxTest.jar
857 Fri Mar 07 13:44:46 COT 2008 META-INF/MANIFEST.MF
762 Fri Mar 07 13:44:48 COT 2008 META-INF/CG1KEY.SF
913 Fri Mar 07 13:44:48 COT 2008 META-INF/CG1KEY.RSA
0 Fri Mar 07 13:39:52 COT 2008 META-INF/
smk 6574 Wed Mar 05 17:41:44 COT 2008 Click2Call.gif
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 3062 Wed Mar 05 17:41:44 COT 2008 IaxTestApplet.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 1193 Wed Mar 05 17:41:44 COT 2008 PhonePanel$1.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 766 Wed Mar 05 17:41:44 COT 2008 PhonePanel$2.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 698 Wed Mar 05 17:41:44 COT 2008 PhonePanel$3.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 698 Wed Mar 05 17:41:44 COT 2008 PhonePanel$4.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 4416 Wed Mar 05 17:41:44 COT 2008 PhonePanel$Listener.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
smk 14948 Wed Mar 05 17:41:44 COT 2008 PhonePanel.class
X.509, CN=Franco Cedillo, OU=IT, O=CyberGod, L=Lima, ST=Lima, C=PE (cg1key)
[certificate will expire on 5/06/08 12:54]
s = signature was verified
m = entry is listed in manifest
k = at least one certificate was found in keystore
i = at least one certificate was found in identity scope
jar verified.
Warning:
This jar contains entries whose signer certificate will expire within six months.

Desplegado de Applet

Finalmente incluímos el código de llamada al Applet desde una sencilla páigna HTML.

Fuente

Signed Applets – How to sign an applet (and get it to work)

10 comentarios en “¿Cómo firmar un Java Applet?”

  1. pd: problema solucionado… solo era que confundi la carpeta de JRE con la del JDK… pero igual no funciona ese punto, no me da el error pero aparece tal cual como si las opciones estubiecen mal escritas, si lo resuelvo posteo el resultado para alguna otra persona que tenga un problema similar. saludos

    Me gusta

  2. hola Neverhags:

    lo que hace «jar cvfm jiaxTest.jar mymanifest -C classes» es

    – crea un jar con el nombre «jiaxTest.jar»
    – le agrega un archivo MANIFEST con el contenido de «mymanifest» (debes crear y editar mymanifest)
    – incluye todos los archivos dentro del directorio «classes»

    saludos 🙂

    Me gusta

  3. muchas gracias amigo! ya he resuelto el problema y era algo tan simple que quizas muchas otras personas puedan tener este problema y les comento…

    cuando estaba en mi consola despues de leer detenidamente el mensaje de error me fijo que al final de dicho comando solo faltaba colocarle un «/ .»

    es decir, el comando a escribir seria el siguiente:
    «jar cvfm jiaxTest.jar mymanifest -C classes/ .»

    muchas gracias por la pronta respuesta. saludos

    Me gusta

  4. despues de haber realizado este paso tengo un par de dudas mas!, la primera seria la siguiente… despues de haber creado (en este caso de ejemplo) el archivo jiarTest.jar, (claro está que no puedo firmar el resto de los archivos porque son inexistentes en mi caso), y luego de firmar dicho archivo creado, me da un error al mostrarlo, puesto que me dice que no encuentra la clase asociada que estoy ejecutando y eso resulta ser un problema puesto que es muy engorroso, existe una manera mas simple de hacerlo a traves de netbeans?… porque no me imagino como seria probar un simple codigo si es necesario compilar el JAR cada vez que cambian las classes y eso en caso de que consiga hacer que muestre el applet en un navegador!

    Me gusta

  5. ya entiendo porque no hay muchos codigos relacionados a el applet que intento crear… creo q me dedicare mejor a estudiar pre-escolar xD muchas gracias por la ayuda, seguire comentando si tengo algun adelanto, de seguro es de ayuda para mas novatos como yo

    Me gusta

  6. ¡Lo he conseguido!
    explico mi caso particular por si a alguien le intereza:
    He estado realizando un applet que debe leer archivos en el disco duro, obviamente este no me deja sin un certificado… Gracias a la ayuda del compañero Franco y a algunos q otros documentos encontrados encontre una manera por la cual puedo trabajar tranquilamente con net beans (aunque sea un poco tedioso), y no es mas que firmar directamente el JAR que se encuentra en dist (El proyecto ya compilado por netbeans) usando:

    …/dist>jarsigner PROYECTO.jar CERTIFICADO -verbose

    el nombre del proyecto y el del certificado para el caso de esta guia (Para su entendimiento) seria algo como:

    …/dist>jarsigner jiaxTest.jar cg1key -verbose

    Muchas gracias por esta guia que me ha sido de mucha utilidad y espero que mis dudas sirvan para aclarar las de otros. saludos y suerte para todos

    Me gusta

  7. buen dia, he realizado los pasos como indicas sin embargo me marka lo siguiente:

    C:\Archivos de programa\Java\jdk1.6.0_21\bin>jar cvfm jiaxTest.jar mymanifest -C
    classes/
    Uso: jar {ctxui}[vfm0Me] [archivo-jar] [archivo-manifiesto] [punto-entrada] [-C
    dir] archivos…
    Opciones:
    -c crear archivo de almacenamiento
    -t crear la tabla de contenido del archivo de almacenamiento
    -x extraer el archivo mencionado (o todos) del archivo de almacenamiento
    -u actualizar archivo de almacenamiento existente
    -v generar salida detallada de los datos de salida estßndar
    -f especificar nombre del archivo de almacenamiento
    -m incluir informaci¾n de un archivo de manifiesto especificado
    -e especificar punto de entrada de la aplicaci¾n para aplicaci¾n aut¾noma
    que se incluye dentro de un archivo jar ejecutable
    -0 s¾lo almacenar; no utilizar compresi¾n ZIP
    -M no crear un archivo de manifiesto para las entradas
    -i generar informaci¾n de Ýndice para los archivos jar especificados
    -C cambiar al directorio especificado e incluir el archivo siguiente
    Si alg·n archivo coincide tambiÚn con un directorio, ambos se procesarßn.
    El nombre del archivo de manifiesto, el nombre del archivo de almacenamiento y e
    l nombre del punto de entrada se
    especifican en el mismo orden que las marcas ‘m’, ‘f’ y ‘e’.

    Ejemplo 1: para archivar dos archivos de clases en un archivo de almacenamiento
    llamado classes.jar:
    jar cvf classes.jar Foo.class Bar.class
    Ejemplo 2: utilice un archivo de manifiesto ya creado, ‘mymanifest’, y archive t
    odos los
    archivos del directorio foo/ en ‘classes.jar’:
    jar cvfm classes.jar mymanifest -C foo/ .

    C:\Archivos de programa\Java\jdk1.6.0_21\bin>jar cvfm jiaxTest.jar mymanifest -C
    classes/

    podrian ayudarme porfavor? me pregunto si al declarar el nombre de los archivos deberia llevar la ruta del directorio donde se encuentran, algo asi:

    jar cvfm C:\Documents and Settings\Administrador\Mis documentos\NetBeansProjects\Applet\build\VerificationNonGuiApplet.jar C:\Documents and Settings\Administrador\Mis documentos\NetBeansProjects\Applet\build\mymanifest -C C:\Documents and Settings\Administrador\Mis documentos\NetBeansProjects\Applet\build\classes

    Me gusta

  8. Hola,
    he creado mi primer applet de java pero no se bien porke no puedo visualizarlo en FireFox, pero si en IE6, ¿alguien tiene idea de pk no puedo ejecutarlo en FireFox?

    Gracias:D

    Me gusta

Deja un comentario