Intercambiar Ficheros
Si queremos enviar electrónicamente un documento importante, como un contrato, a otra persona, es una buena idea firmarlo "digitalmente", para que el receptor tenga una forma de comprobar que el documento realmente procede de nosotros y no fue alterado durante el tránsito.
Esta lección ilustra el uso de las herramientas relacionadas con la seguridad para el intercambio de un documento importante, en este caso un contrato. Primero seremos el emisor del contrado, Stan Smith. Esta lección muestra los pasos de Stan para poner el contrato en un fichero JAR, firmarlo, y exportar el certificado de la clave pública para la clave pública correspondiente a la clave privada usada para firmar el fichero JAR.
Luego seremos Ruth, que recibe el fichero JAR firmado y el certificado. USaremos keytool para importar el certificado en nuestro keystore en una entrada con el alias stan, y la herramienta jarsigner para verificar la firma.
Para más información sobre firmas digitales, certificados, keystores y herramientas puedes volver a la página API y Herramientas Usadas para Código Seguro e Intercambio de Ficheros.
Nota: Los comandos ejecutados en esta lección asumen que los hacemos todo dentro del mismo directorio.
Pasos del Emisor del Contrato
Los pasos desarrollados aquí para el emisor del contrato son básicamente los mismos que los listados paa el firmante de códico en la lección Firmar Código y Conceder Permisos. Sin embargo, aquí pretendemos ser Stan Smith en vez de Susan Jones y estamos almacenando un fichero de datos en vez de clases en un fichero JAR para ser firmado.
Los pasos que debemos tomar como emisores del contrato son los siguientes.
Crear un Fichero JAR que Contenga el Contrato
Lo primero que necesitamos es un fichero del contrato. Podemos descargar y usar este fichero de ejemplo muy básico llamado contract. O usar otro que nosotros queramos, sólo deberemos asegurarnos de que se llama contract para que funcionen todos los comandos de la lección.
Ya que tenemos un fichero de contrato, podemos situarlo en un Fichero JAR. En nuestra ventana de comandos tecleamos lo siguiente.
jar cvf Contract.jar contract
Este comando crea un fichero JAR llamado Contract.jar y sitúa el fichero contract dentro de él.
Generar Claves
Antes de firmar el fichero Contract.jar que contiene el contrato, necesitamos generar las claves, si todavía no las tenemos disponibles. La clave privada es necesaria para firmar el fichero JAR, y la correspondiente clave pública es necesaria para que el receptor del contrato pueda verificar la firma.
Esta lección asume que no tenemos dichas claves. Vamos a crear un keystore llamado stanstore y crear una entrada con una pareja de claves pública/privada recien generadas (con la clave pública en un certificado).
Ahora imaginemos que somos Stan Smith y que trabajamos en el departamente legal de la corporación XYZ. Tecleamos lo siguiente en nuesta ventana de comandos para crear un keystore llamado stanstore y para generar las claves para Stan Smith.
keytool -genkey -alias signLegal -keystore stanstore
Se nos pedirá que introduzcamos la password del keystore, nuestra información de nombre distinguido, y las password de la clave. Aquí tenemos las preguntas, la parte en negrita indica lo que tenemos que teclear.
Enter keystore password: balloon53
What is your first and last name?
[Unknown]: Stan Smith
What is the name of your organizational unit?
[Unknown]: Legal
What is the name of your organization?
[Unknown]: XYZ
What is the name of your City or Locality?
[Unknown]: New York
What is the name of your State or Province?
[Unknown]: NY
What is the two-letter country code for this unit?
[Unknown]: US
Is <CN=Stan Smith, OU=Legal, O=XYZ, L=New York,
ST=NY, C=US> correct?
[no]: y
Enter key password for <signLega>
(RETURN if same as keystore password): cat876
El comando keytool anterior crea el keystore llamado stanstore en el mismo directorio en el que se ejecuta el comando (asumiendo que el keystore especificado no existía) y le asigna la password balloon53. El comando genera una pareja de claves pública/privada para la entidad cuyo nombre distinguido tiene el nombre común de Stan Smith y una unidad organizativa de Legal.
El certificado auto-firmado creado incluye la clave pública y la información del nombre distinguido. (El nombre distinguido que suministramos se usará en el campo "subject" en el certificado). Este certificado será válido durante 90 días, el periodo por defecto de validez si no especificamos una opción -validity. El certificado está asociado con la clave privada en una entrada del keystore referida por el alias signLegal. La clave privada tiene asignada la password car876.
Firmar el Fichero JAR
Ahora ya estamos listos para firmar el fichero JAR.
Tecleamos lo siguiente en nuestra línea de comandos para firmar el fichero JAR Contract.jar, usando la clave privada de la entrada del keystore con el alias signLegal, y el nombre del fichero JAR resultante será sContract.jar.
jarsigner -keystore stanstore -signedjar sContract.jar
Contract.jar signLegal
(Debemos teclear todo en un sóla línea.)
Se nos pedirá que introduzcamos la password del keystore (balloon53) y la password de la clave privada (cat876).
La herramienta jarsigner extrae el certificado de la entrada del keystore cuyo alias es signLegal y lo adjunta a la firma generada para el fichero JAR firmado.
Exportar el Certificado de la Clave Pública
Ahora ya tenemos un fichero JAR firmado sContract.jar. El cliente que va usar el fichero querrá autentificar la firma. Para hacerlo, necesita la clave pública correspondiente a la clave privada usada para generar la firma. Le suministramos esta clave enviándole una copia del certificado que contiene la clave pública. Copiamos el certificado desde el keystore stanstore a un fichero llamado StanSmith.cer haciendo esto.
keytool -export -keystore stanstore -alias signLegal -file StanSmith.cer
Se nos pedirá que introduzcamos la password del keystore(balloon53).
Con el certificado y el fichero JAR firmado, un cliente puede usar la herramienta jarsigner para autentificar nuestra firma, como veremos luego.
Pasos del Receptor del Contrato
Ahora actuaremos como Ruth, y recibiremos el fichero JAR firmado y el certificado de Stan, realizaremos los siguientes pasos, como indica la figura.
Importar el Certificado como un Verdadero Certificado
Supongamos que somos Ruth y que hemos recibido de Stan Smith.
- >El fichero JAR sContrat.jar, que contiene el fichero del contrato, y
- el fichero StanSmith.cer, que contiene el certificado de clave pública para la clave pública correspondiente a la clave privada usada para firmar el fichero JAR.
Antes de poder usar la herramienta jarsigner para comprobar la autenticidad de la firma del fichero JAR, necesitamos importar en nuestro keystore el certificado de Stan.
Aunque nosotros (actuando como Stand) creamos que estos ficheros no han sido transportados a ningún lugar , podemos simular que somos una persona distinta a la que lo creó y lo envió, Stan. Actuando como Ruth, tecleando lo siguiente para crear un Keystore llamado ruthstore e importar el certificado dentro de una entrada con el alias stan.
keytool -import -alias stan -file StanSmith.cer -keystore ruthstore
Como el keystore no existe, será crado. Se nos pedirá una password para el keystore, tecleamos la password que queramos.
El keytool imprimirá la información del certificado y nos pedirá que lo verifiquemos, por ejemplo, comparando la huella dactilar del certificado mostrado con aquellas obtenidas de otra fuente de información (contrastada). (Cada huella dactilar es un número relativamente corto y único que identifica un certificado). Por ejemplo, en el mundo real podríamos llamar a Stan y preguntarle cual debería ser su huella dactilar. El puede obtener la huella del fichero StanSmith.cer que ha creado usando el comando.
keytool -printcert -file StanSmith.cer
Si las huellas dactilares corresponden, el certificado no ha sido modificado durante el tránsito. En este caso podemos permitir que keytool proceda con la inclusión de la entrada de certificado verdadero en el keystore. La entrada contiene los datos del certificado de la clave pública obtenidos del fichero StanSmith.cer y se le asigna el alias stan.
Verificar la Firmar del Fichero JAR
Ahora que nosotros, actuando como Ruth, hemos importado el certificado de la clave pública de Stan dentro de ruthstore como un certificado verdadero, podemos usar la herramienta jarsigner para verificar la autencidad de la firma del fichero JAR.
Cuando se verifica un fichero JAR, verificamos que la firma es válida y que el fichero JAR no ha sigo modificado. Podemos hacer esto para el fichero sContract.jar mediante el siguiente comando.
jarsigner -verify -verbose -keystore ruthstore sContract.jar
Deberiámos ver algo como esto.
183 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.SF
1542 Fri Jul 31 10:49:54 PDT 1998 META-INF/SIGNLEGAL.DSA
0 Fri Jul 31 10:49:18 PDT 1998 META-INF/
smk 1147 Wed Jul 29 16:06:12 PDT 1998 contract
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.
Debemos asegurarnos de ejecutar el comando con la opción -verbose para obtener información suficiente para asegurar que:
- El fichero del contrato está entre los ficheros del fichero JAR que fue firmado y que su firma fue verificada (lo que significa la s), y
- La clave pública usada para verificar la firma esta en el keystore especificado y que lo consideramos verdadero (lo que significa la k).