## Firmar ficheros JAR

El JDK de JavaTM contiene las herramientas que necesitas para firmar ficheros JAR. Dependiendo de la versión del JDK que tengas, utilizarás:

- JDK 1.2 La herramienta JAR de Firma y Verificación
- JDK 1.1 La herramienta de Seguridad JAVA

### La Herramienta JAR de Firma y Verificación del JDK 1.2

Esta herramienta se invoca utilizando el comando jarsigner, por lo tanto, nos referiremos a ella como "Jarsigner".

Para firmar un fichero JAR, primero debes tener una clave privada. Las claves privadas y sus correspondientes claves públicas están almacenadas en bases de datos protegidas llamadas keystores. Un keystore puede contener las claves de muchos firmantes potenciales. Cada clave del keystore puede ser identificada por un alias que suele ser el nombre del firmante propietario de la clave. Por ejemplo, la clave perteneciente a Rita Jones, podría tener el alias "rita".

La forma básica para el comando de firma de un fichero JAR es

    jarsigner jar-file alias

En este comando:

- jar-file Es el nombre del fichero JAR a firmar.
- alias es el alias que identifica la clave privada que se utilizará para firmar el fichero JAR, y su certificado asociado.

La herramienta Jarsigner te pedirá las passwords para el keystore y el alias.

La forma básica de este comando asume que el keystore a utilizar es un fichero llamado .keystore en tu directorio. Creará la firma y el fichero de bloques de firmas con los nombres x.SF y x.DSA respectivamente, donde x son las primeras ocho letras del alias, todas en mayúsculas. Este comando básico, sobre-escribirá el fichero JAR original con el fichero JAR firmado.

En la práctica, podrías querer utilizar este comando en conjunción con una o más de estas funciones:

- -keystore file - especifica un fichero keystore por defecto si no quieres utilizar la base de datos por defecto .keystore.
- -storepass password - Te permite introducir la password del keystore en la línea de comandos en vez de pedirtelo.
- -keypass password - Te permite introducir la password del alias en la línea de comandos en vez de pedirtelo.
- -sigfile file - especifica el nombre base para los ficheros .SF y .DSA si no quieres que el nombre base se tome de tu alias. file debe estar compuesto solo por letras mayúsculas (A-Z), numerales (0-9), subrayado.
- -signedjar file - especifica el nombre del fichero JAR firmado a generar, si no quieres que el fichero original sea sobre-escrito con el fichero firmado.

### Ejemplo

Veamos un par de ejemplos de firma de ficheros JAR con la herramienta Jarsigner. En estos ejemplos asumimos que:

- Tu alias es "johndoe".
- la keystore que quieres utilizar es un fichero llamado "mykeys" en el directorio de trabajo actual.
- la password del keystore es "abc123".
- la password de tu alias es "mypass".

Para firmar un fichero JAR llamado app.jar, podrías utilizar este comando:

    jarsigner -keystore mykeys -storepass abc123
              -keypass mypass app.jar johndoe

Como este comando no utiliza la opción -sigfile, los ficheros .SF y .DSA se crearan con los nombres JOHNDOE.SF y JOHNDOE.DSA. Como el comando no utiliza la opción -signedjar, el fichero firmado resultante sobre-escribirá la versión original de app.jar.

Veamos que sucedería si utilizaramos una combinación de opciones diferente:

    jarsigner -keystore mykeys -sigfile SIG
              -signedjar SignedApp.jar app.jar johndoe

Esta vez, te pedirá que introduzcas las passwords para el Keystore y el alias porque no se han especificado en la línea de comandos. (Por razones de seguridad, probablemente no es una buena idea especificar tus passwords en la línea de comandos.) Los ficheros de firma y bloque de firmas se llamarán SIG.SF y SIG.DSA, respectivamente, y el fichero firmado SignedApp.jar se situará en el directorio actual. El fichero JAR original permanece como estaba.

### Página de Referencia de Jarsigner

Las páginas completas de referencia de la herramienta de firma y verificaciónde ficherso JAR están on-line:

- Página de Referencia de Jarsigner con ejemplos Windows
- Página de Referencia de Jarsigner con ejemplos Solaris

### La herramienta de Seguridad Java del JDK 1.1

Si estás utilizando la versión 1.1 del JDK, utilizarás la herramienta de seguridad Java para firmar ficheros JAR. Para llamar a esta herramienta se utiliza el comando javakey, por eso, la llamaremos "Javakey" para acortar.

La herramienta Javakey maneja una base de datos que contiene parejas de claves pública/privada y los certificados relacionados. Para firmar un fichero JAR con esta herramienta, necesitas tener una pareja de claves pública/privada en esta base de datos. La herramienta JavaKey buscará la base de datos en la localización especificada por la propiedad identity.database en el fichero de propiedades de seguridad, java.security. Normalmente la base de datos contiene pares de claves de muchos firmantes potenciales, cada par de claves está asociado con el nombre de usuario de un firmante.

Además de los pares de claves, la base de datos de Javakey contiene certificados para las claves públicas. Cuando se añade un certificado a la base de datos, Javakey le asigna un número único para propósitos de identificación.

Para firmar un fichero, debes proporcionar a Javakey esta información:

- El nombre de usuario del par de claves a utilizar.
- El número de certificado a utilizar.
- El nombre que deben tener los ficheros de firma y de bloque de firmas.
- El nombre del fichero JAR firmado.

Esta información se proporciona utilizando un directive file, que es básicamente un fichero de propiedades que lee Javakey cuando firma un fichero JAR. Aquí tienes un ejemplo:

    # The signer property specifies the username corresponding to
    # the key pair that Javakey is to use to sign the JAR file.
    # In this example, Javakey will sign the file using the key pair
    # belonging to user "rita".

    signer=rita

    # The cert property tells Javakey which certificate to use. Each
    # certificate in Javakey's database is identified by a number.
    # To see a list of all the certificates and associated numbers in
    # the database, use the command 'javakey -ld'.

    cert=1

    # The signature.file property specifies the name that the signature
    # file and signature block file are to have.  In this example,
    # the files will be named SIGFILE.SF and SIGFILE.DSA, respectively.

    signature.file=sigfile

    # The out.file property specifies the name that Javakey should give
    # to the signed JAR file it produces.  This property is optional.
    # If it's not present, Javakey will give the signed file the name
    # of the original JAR file, but with a .sig filename extension.

    out.file=rita.jar

Una vez que tu fichero directivo está listo, puedes firmar tu fichero JAR utilizando un comando con esta forma:

    javakey -gs directive-file jar-file

En este comando:

- -gs es la opción que le dice a Javakey que firme un fichero JAR.
- directive-file es el path y el nombre del fichero deirectivo que Javakey debería utilizar.
- jar-file es el path y el nombre del fichero JAR que quieres firmar.

Javakey situará el fichero JAR firmado en el directivo actual.

Javakey puede realizar muchas otras funciones relacionadas con el manejo de bases de datos de claves y certificados. Puedes ver la documentación on-line del JDK para más información sobre JavaKey:

- Página de referencia de Javakey para Windows
- Página de referencia de Javakey para Solaris

Ozito