¿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 programaJavajdk1.6.0_04bin”.
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
(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
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 cg1
key
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