Un archivo JAR (por sus siglas en inglés, Java ARchive)
es un tipo de archivo que permite ejecutar aplicaciones escritas
en el lenguaje de programación Java.
La firma de un archivo JAR tiene como principal objetivo
permitir a la persona que lo ejecuta
la verificación de la identidad de su creador
con el fin de que
el usuario de la aplicación
pueda discernir si la misma es confiable o no,
y por tanto, decida hacer uso de esta.
En pocas palabras, El firmado digital de un JAR
permite garantizar la integridad y el no repudio del software
por parte de la persona que lo utilizará.
La firma del archivo JAR se hace a través de un certificado digital.
Un certificado digital se define como un fichero informático
generado por una entidad de servicios de certificación
que asocia unos datos de identidad a una persona física,
organismo o empresa, confirmando,
de esta manera, su identidad digital.
Además, hay que tener presente que
los certificados se deben almacenar en keystores
y para un mejor uso, cada certificado
puede ser referenciado mediante un alias,
que, por lo general,
suele ser el nombre de la persona que firma la clave.
-
Para cuestiones de ejemplo de crear la firma,
se utilizará la siguiente clase que será empaquetada en un JAR.
Además, esta clase contiene un método sensible.
CLI.java
package com.fluidattacks;
class CLI
{
public static void main(String[] argumentos)
{
System.out.println("public static void main");
}
protected static void metodoProtegido()
{
System.out.println("protected static void metodoProtegido");
}
}
-
Lo primero que se debe hacer
es generar un par de certificados (llave pública y privada)
los cuales deben ser almacenados en un keystore.
keytool -keystore keystore -alias fluidattacks -genkey \ -dname "cn=Technology, ou=Engineering,
o=Fluid Attacks, c=CO" \ -keypass keypass -storepass storepass
-
Luego, se procede a compilar la clase.
export CLASSPATH=src
javac src/com/fluidattacks/CLI.java
-
Se debe crear el archivo MANIFEST.MF
requerido al momento de crear el .jar.
$ cat META-INF/MANIFEST.MF
Main-Class: com.fluidattacks.CLI
Name: com/fluidattacks/
Sealed: true
-
Se empaqueta entonces el programa compilado en un archivo JAR.
El archivo será paquete-1.0.jar, el cual usaremos para firmar.
$ jar -cvfm paquete-1.0.jar META-INF/MANIFEST.MF -C src .added manifest
adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/fluidattacks/(in = 0) (out= 0)(stored 0%)
adding: com/fluidattacks/CLI.java(in = 262) (out= 144)(deflated 45%)
adding: com/fluidattacks/CLI.class(in = 551) (out= 348)(deflated 36%)
-
Finalmente, procedemos a firmar el paquete generado
paquete-1.0.jar con el alias fluidattacks
alojado en el keystore previamente creado:
jarsigner -keystore keystore -storepass storepass -keypass keypass \
-signedjar paquete-firmado-1.0.jar paquete-1.0.jar fluidattacks
-
Se procede a ejecutar el programa para verificar su funcionamiento.
$ java -jar paquete-1.0.jar
public static void main
-
Adicionalmente, es posible utilizar la herramienta jarsigner
para verificar la firma de un paquete.
Para el ejemplo, se verificará la firma de paquete paquete-1.0.jar.
$ jarsigner -keystore keystore -certs -verbose -verify paquete-firmado-1.0.jar
297 Thu Nov 24 10:45:14 COT 2011 META-INF/MANIFEST.MF
347 Thu Nov 24 10:45:14 COT 2011 META-INF/fluidattacksSIG.SF
978 Thu Nov 24 10:45:14 COT 2011 META-INF/fluidattacksSIG.DSA
0 Thu Nov 24 10:45:12 COT 2011 META-INF/
0 Fri Sep 17 11:18:22 COT 2010 com/
0 Fri Sep 17 11:18:22 COT 2010 com/fluidattacks/
smk 262 Tue Nov 11 11:31:06 COT 2008 com/fluidattacks/CLI.java
X.509, CN=Technology, OU=Engineering, O=Fluid Attacks, C=CO (Fluid Attacks)
[certificate will expire on 2/22/12 10:45 AM]
smk 551 Thu Nov 24 10:45:10 COT 2011 com/fluidattacks/CLI.class
X.509, CN=Technology, OU=Engineering, O=Fluid Attacks, C=CO (Fluid Attacks)
[certificate will expire on 2/22/12 10:45 AM]
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.