En este documento, vamos a resumir cómo utilizar las herramientas proporcionadas en el Kit de Desarrollo Java ™ para firmar y verificar los archivos JAR:
La plataforma Java ™ le permite firmar digitalmente los archivos JAR. Firmamos digitalmente un archivo por la misma razón que podemos firmar un documento en papel con pluma y tinta, para que los lectores sepan que escribió el documento, o al menos que el documento tiene nuestra aprobación.
Cuando usted firma una carta, por ejemplo, todos los que reconocen su firma pueden confirmar que escribió la carta. Del mismo modo cuando se firma digitalmente un archivo, cualquier persona que "reconoce" su firma digital sabe que el archivo procede de usted. El proceso de "reconocimiento" de las firmas electrónicas se llama verificación.
La posibilidad de firmar y verificar archivos es una parte importante de la arquitectura de seguridad de la plataforma Java. La seguridad es controlada por la política de seguridad que esté en vigor en tiempo de ejecución. Puede configurar la directiva para conceder privilegios de seguridad para los applets y aplicaciones. Por ejemplo, puede conceder permiso a un applet para realizar operaciones normalmente prohibidas, tales como leer y escribir archivos locales o ejecutar programas locales ejecutables. Si ha descargado un código firmado por una entidad de confianza, puede utilizar este hecho como un criterio para decidir cuál de los permisos de seguridad asignará al código.
Una vez que usted (o su navegador) han comprobado que un applet es de una fuente confiable, usted puede relajar las restricciones de seguridad para que el applet realice operaciones que normalmente estarían prohibidas. Un applet de confianza puede tener libertades como se especifica en el archivo de política en vigor.
La plataforma Java permite a la firma y la verificación mediante el uso de números especiales llamados claves públicas y privadas. Las claves públicas y claves privadas vienen en pares, y desempeñan papeles complementarios.
La clave privada es la "pluma" electrónica con la que se puede firmar un archivo. Como su nombre indica, la clave privada es conocida sólo por usted, para que nadie más puede "falsificar" su firma.
Un archivo firmado con su clave privada sólo puede ser comprobada por la correspondiente clave pública.
Las claves pública y privada por sí solas, sin embargo, no son suficientes para verificar realmente la firma. Incluso si usted ha verificado que un archivo firmado contiene un par de claves correspondientes entre sí, aún necesita alguna manera de confirmar que la clave pública en realidad proviene de la persona de la que la firma pretende provenir.
Se requiere un elemento más, por lo tanto, para hacer la firma y verificación. Este elemento adicional es el certificado de que el firmante incluye en un fichero JAR firmado. Un certificado es una declaración firmada digitalmente de una autoridad de certificación reconocida que indica que es dueño de una clave pública determinada. Una autoridad de certificación son las entidades (generalmente empresas especializadas en seguridad digital) que son de confianza en toda la industria para firmar y emitir certificados para las teclas y sus propietarios.
En el caso de los archivos JAR firmados, el certificado indica que es dueño de la clave pública contenida en el archivo JAR.
Al firmar un fichero JAR su clave pública se coloca dentro del archivo, junto con un certificado asociado para que sea de fácil acceso para su uso por cualquier persona que desee verificar su firma.
Para resumir la firma digital:
- El firmante firma el archivo JAR utilizando una clave privada.
- La clave pública correspondiente se coloca en el archivo JAR, junto con su certificado, por lo que está disponible para su uso por cualquier persona que quiera verificar la firma.
Resúmenes y el fichero de firmas.
Al firmar un fichero JAR, cada fichero del archivo tiene una entrada de resumen en el archivo de manifiesto. He aquí un ejemplo de lo que tal entrada podría ser:
Name: test/classes/ClassOne.class
SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=
Los valores son representaciones hash o codificadas de los contenidos de los archivos tal como estaban en el momento de la firma. El resumen de un archivo cambiará sí y sólo si el propio fichero cambia.
Cuando se firma un archivo JAR se genera automáticamente un archivo de firma y se coloca en el directorio META-INF
del archivo JAR, el mismo directorio que contiene el archivo de manifiesto. Los archivos de firmas tienen nombres de archivo con una extensión. SF. He aquí un ejemplo del contenido de un archivo de firma:
Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: 1.6.0 (Sun Microsystems Inc.)
Name: test/classes/ClassOne.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=
Name: test/classes/ClassTwo.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=
Name: test/images/ImageOne.gif
SHA1-Digest: kdHbE7kL9ZHLgK7akHttYV4XIa0=
Name: test/images/ImageTwo.gif
SHA1-Digest: mF0D5zpk68R4oaxEqoS9Q7nhm60=
Como puede ver, el archivo de firma contiene entradas de resumen para los archivos del archivo comprimido que se parecen a las entradas de valor de síntesis, en el manifiesto. Sin embargo, mientras que los valores de resumen en el manifiesto se calculan a partir de los propios archivos, los valores de resumen en el archivo de firma se calculan a partir de las entradas correspondientes en el manifiesto. Los archivos de firma también contienen un valor de resumen para el manifiesto completo (ver la cabecera SHA1-Digest-Manifest
en el ejemplo anterior).
Cuando un fichero JAR firmado está siendo verificado, los resúmenes de cada uno de los archivos se vuelven a calcular y comparar con los resúmenes, registrada en el manifiesto para asegurar que el contenido del archivo JAR no han cambiado desde que se firmó. Como una comprobación adicional, los valores de resumen para el archivo de manifiesto en sí se vuelven a calcular y se compara con los valores registrados en el archivo de firma.
Puede obtener información adicional sobre los archivos de firma en la página Formato de manifiesto de la documentación del JDK ™.
El archivo de bloque de firma.
Además de los archivos de firmas, se coloca automáticamente un archivo de bloque de firma en el directorio META-INF
cuando se firma un archivo JAR. A diferencia del archivo de manifiesto o el archivo de firma, los archivos de bloques de firmas no son legibles.
El archivo de bloque de firma contiene dos elementos esenciales para la verificación: La firma digital para el archivo JAR que se generó con la clave privada del firmante El certificado que contiene la clave pública del firmante, para ser utilizado por cualquier persona que desea verificar el archivo JAR firmado.
Los nombres de los archivos de bloques de firmas suelen tener una extensión. DSA lo que indica que fueron creados por el algoritmo predeterminado de firma digital. Otras extensiones de nombre de archivo son posibles si las claves asociadas con algún algoritmo estándar de otros se utilizan para la firma.
Firmar archivos JAR.
Se utiliza la firma de JAR y una herramienta de verificación para firmar ficheros JAR. La invocación de la firma JAR y herramienta de verificación mediante el comando jarsigner
, por lo que nos referiremos a ella como "Jarsigner".
Para firmar un fichero JAR, primero debe tener una clave privada. Las claves privadas y sus correspondientes claves públicas se almacenan en bases de datos protegidas llamadas Keystore. Un keystore puede contener las claves de muchos firmantes potenciales. Cada clave del almacén de claves puede ser identificado por un alias que suele ser el nombre del firmante y que posee la clave. La clave que pertenecen a María Jiménez, podría tener el alias de "Maria", por ejemplo.
La forma básica del comando para la firma de un archivo JAR es:
jarsigner jar-file alias
En este comando:jar-file
es la ruta del archivo JAR a firmar, alias es el alias que identifica la clave privada que se utiliza para firmar el archivo JAR, y el certificado asociado.
La herramienta Jarsigner le pedirá la contraseña para el almacén de claves y alias.
En esta forma básica del comando se supone que el almacén de claves a utilizar está en un archivo llamado keystore en su directorio personal. Se va a crear la firma y los archivos de bloques de firmas con nombres x.SF y x.DSA respectivamente, donde x son las primeras ocho letras del alias, todas en mayúsculas. Este comando básico sobrescribe el archivo JAR original con el fichero JAR firmado.
En la práctica, es posible que desee utilizar este comando junto con uno o más de estas opciones, que debe preceder a la ruta jar-file.