¿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
Signed Applets – How to sign an applet (and get it to work)
» Leer más …